// ============================================================================ // // 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.views; import java.lang.reflect.InvocationTargetException; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import org.apache.log4j.Logger; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IWorkspace; import org.eclipse.core.resources.IWorkspaceRunnable; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.NullProgressMonitor; import org.eclipse.core.runtime.Status; import org.eclipse.core.runtime.jobs.ISchedulingRule; import org.eclipse.jface.action.IMenuListener; import org.eclipse.jface.action.IMenuManager; import org.eclipse.jface.action.IToolBarManager; import org.eclipse.jface.action.MenuManager; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.operation.IRunnableWithProgress; import org.eclipse.jface.viewers.ColumnViewer; import org.eclipse.jface.viewers.ColumnViewerToolTipSupport; import org.eclipse.jface.viewers.DoubleClickEvent; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.ITreeContentProvider; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.jface.viewers.TreeSelection; import org.eclipse.jface.viewers.Viewer; import org.eclipse.jface.viewers.ViewerCell; import org.eclipse.jface.viewers.ViewerFilter; import org.eclipse.jface.window.ToolTip; import org.eclipse.swt.SWT; import org.eclipse.swt.events.KeyAdapter; import org.eclipse.swt.events.KeyEvent; import org.eclipse.swt.events.KeyListener; import org.eclipse.swt.events.MouseAdapter; import org.eclipse.swt.events.MouseEvent; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.events.TreeAdapter; import org.eclipse.swt.events.TreeEvent; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.layout.FillLayout; import org.eclipse.swt.layout.RowLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.CoolBar; import org.eclipse.swt.widgets.CoolItem; import org.eclipse.swt.widgets.DateTime; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Event; import org.eclipse.swt.widgets.Menu; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Text; import org.eclipse.swt.widgets.ToolBar; import org.eclipse.swt.widgets.ToolItem; import org.eclipse.swt.widgets.Tree; import org.eclipse.swt.widgets.TreeItem; import org.eclipse.ui.IMemento; import org.eclipse.ui.IViewSite; import org.eclipse.ui.IWorkbench; import org.eclipse.ui.IWorkbenchListener; import org.eclipse.ui.PartInitException; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.actions.ActionContext; import org.eclipse.ui.actions.RefreshAction; import org.eclipse.ui.contexts.IContextService; import org.eclipse.ui.navigator.CommonNavigator; import org.eclipse.ui.progress.UIJob; import org.talend.commons.exception.ExceptionHandler; import org.talend.commons.exception.LoginException; import org.talend.commons.exception.PersistenceException; import org.talend.commons.ui.swt.dialogs.ProgressDialog; import org.talend.core.model.general.Project; import org.talend.core.model.metadata.builder.database.PluginConstant; import org.talend.core.model.properties.FolderItem; import org.talend.core.model.repository.ERepositoryObjectType; import org.talend.core.repository.model.ProxyRepositoryFactory; import org.talend.dataprofiler.core.CorePlugin; import org.talend.dataprofiler.core.ImageLib; import org.talend.dataprofiler.core.i18n.internal.DefaultMessagesImpl; import org.talend.dataprofiler.core.manager.DQStructureManager; import org.talend.dataprofiler.core.migration.helper.WorkspaceVersionHelper; 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.service.GlobalServiceRegister; import org.talend.dataprofiler.core.service.IService; import org.talend.dataprofiler.core.service.IViewerFilterService; import org.talend.dataprofiler.core.ui.action.actions.EditDFTableAction; import org.talend.dataprofiler.core.ui.action.actions.EditFileDelimitedAction; import org.talend.dataprofiler.core.ui.action.actions.EditHDFSConnectionAction; import org.talend.dataprofiler.core.ui.action.actions.EditHadoopClusterAction; import org.talend.dataprofiler.core.ui.action.actions.OpenItemEditorAction; import org.talend.dataprofiler.core.ui.editor.indicator.IndicatorEditor; import org.talend.dataprofiler.core.ui.editor.indicator.IndicatorEditorInput; import org.talend.dataprofiler.core.ui.filters.AbstractViewerFilter; import org.talend.dataprofiler.core.ui.filters.EMFObjFilter; import org.talend.dataprofiler.core.ui.filters.FolderObjFilter; import org.talend.dataprofiler.core.ui.filters.ReportingFilter; import org.talend.dataprofiler.core.ui.progress.ProgressUI; import org.talend.dataprofiler.core.ui.utils.HadoopClusterUtils; import org.talend.dataprofiler.core.ui.utils.WorkbenchUtils; import org.talend.dataprofiler.core.ui.views.layout.BorderLayout; import org.talend.dataprofiler.migration.manager.MigrationTaskManager; import org.talend.dataquality.indicators.definition.IndicatorDefinition; import org.talend.dq.helper.ProxyRepositoryManager; import org.talend.dq.helper.RepositoryNodeHelper; import org.talend.dq.helper.SqlExplorerUtils; import org.talend.dq.indicators.definitions.DefinitionHandler; import org.talend.dq.nodes.AnalysisRepNode; import org.talend.dq.nodes.DBTableRepNode; import org.talend.dq.nodes.DBViewRepNode; import org.talend.dq.nodes.DFConnectionRepNode; import org.talend.dq.nodes.DFTableRepNode; import org.talend.dq.nodes.DQRepositoryNode; import org.talend.dq.nodes.PatternRepNode; import org.talend.dq.nodes.ReportFileRepNode; import org.talend.dq.nodes.ReportRepNode; import org.talend.dq.nodes.RuleRepNode; import org.talend.dq.nodes.SysIndicatorDefinitionRepNode; import org.talend.dq.nodes.foldernode.AbstractFolderNode; import org.talend.dq.nodes.hadoopcluster.HDFSOfHCConnectionNode; import org.talend.dq.nodes.hadoopcluster.HadoopClusterConnectionRepNode; import org.talend.repository.ProjectManager; import org.talend.repository.RepositoryWorkUnit; import org.talend.repository.model.IRepositoryNode; import org.talend.repository.model.RepositoryNode; import org.talend.resource.ResourceService; import org.talend.utils.ProductVersion; import orgomg.cwm.objectmodel.core.ModelElement; /** * @author rli */ public class DQRespositoryView extends CommonNavigator { protected static Logger log = Logger.getLogger(DQRespositoryView.class); public static final String ID = "org.talend.dataprofiler.core.ui.views.DQRespositoryView"; //$NON-NLS-1$ private Map<String, AbstractViewerFilter> filterMap = new HashMap<String, AbstractViewerFilter>(); private static final String VIEW_CONTEXT_ID = "org.talend.dataprofiler.core.ui.views.DQRespositoryView.viewScope"; //$NON-NLS-1$ private ITreeContentProvider contentProvider = null; DQStructureManager manager; public DQRespositoryView() { super(); // MOD qiongli 2010-9-7,bug 14698,add 'try...catch' try { RepositoryWorkUnit<Object> dQRepositoryWorkUnit = new RepositoryWorkUnit<Object>("Create DQ Repository structure") { //$NON-NLS-1$ @Override protected void run() { final IWorkspaceRunnable op = new IWorkspaceRunnable() { public void run(IProgressMonitor monitor) throws CoreException { manager = DQStructureManager.getInstance(); if (manager.isNeedCreateStructure()) { manager.createDQStructure(); } } }; IRunnableWithProgress iRunnableWithProgress = new IRunnableWithProgress() { public void run(final IProgressMonitor monitor) throws InvocationTargetException, InterruptedException { IWorkspace workspace = ResourcesPlugin.getWorkspace(); try { ISchedulingRule schedulingRule = workspace.getRoot(); // the update the project files need to be done in the workspace runnable to // avoid all notification of changes before the end of the modifications. workspace.run(op, schedulingRule, IWorkspace.AVOID_UPDATE, monitor); } catch (CoreException e) { throw new InvocationTargetException(e); } } }; try { // do not use the UI related iRunnableWithProgress.run(new NullProgressMonitor()); } catch (Exception e) { ExceptionHandler.process(e); } } }; // TDQ-11267 by zshen ForceTransaction attribute make sure TDQ folder can be commit on the server dQRepositoryWorkUnit.setAvoidUnloadResources(true); dQRepositoryWorkUnit.setUnloadResourcesAfterRun(true); dQRepositoryWorkUnit.setFilesModifiedOutsideOfRWU(true); dQRepositoryWorkUnit.setForceTransaction(true); ProxyRepositoryFactory.getInstance().executeRepositoryWorkUnit(dQRepositoryWorkUnit); if (manager.isNeedMigration()) { // TDQ-12154 commit all once after all migrations done. RepositoryWorkUnit<Object> workUnit = new RepositoryWorkUnit<Object>("Migration for DQ Repository") { //$NON-NLS-1$ @Override protected void run() { final IWorkspaceRunnable op = new IWorkspaceRunnable() { public void run(IProgressMonitor monitor) throws CoreException { ProductVersion wVersion = WorkspaceVersionHelper.getVesion(); new MigrationTaskManager(wVersion).doMigrationTask(monitor); } }; IRunnableWithProgress iRunnableWithProgress = new IRunnableWithProgress() { public void run(final IProgressMonitor monitor) throws InvocationTargetException, InterruptedException { IWorkspace workspace = ResourcesPlugin.getWorkspace(); try { ISchedulingRule schedulingRule = workspace.getRoot(); // the update the project files need to be done in the workspace runnable to // avoid all notification of changes before the end of the modifications. workspace.run(op, schedulingRule, IWorkspace.AVOID_UPDATE, monitor); } catch (CoreException e) { throw new InvocationTargetException(e); } } }; try { // need to display the progress on UI ProgressUI.popProgressDialog(iRunnableWithProgress); } catch (Exception e) { ExceptionHandler.process(e); } } }; workUnit.setAvoidUnloadResources(true); ProxyRepositoryFactory.getInstance().executeRepositoryWorkUnit(workUnit); } } catch (Exception e) { log.error(e, e); } } /* * (non-Javadoc) * * @see org.eclipse.ui.navigator.CommonNavigator#init(org.eclipse.ui.IViewSite, org.eclipse.ui.IMemento) */ @Override public void init(IViewSite site, IMemento mem) throws PartInitException { super.init(site, mem); // MOD msjian TDQ-7840 2013-9-9: set the "Link with Editor" default value is "linked" if (mem == null) { setLinkingEnabled(true); } // TDQ-7840~ // MOD qiongli 2010-9-7,bug 14698,add 'try...catch' try { addPostWindowCloseListener(); initToolBar(); initWorkspace(); // TDQ-9711 init all ManagedDrivers and alias. if (SqlExplorerUtils.getDefault().isServiceInstalled()) { SqlExplorerUtils.getDefault().initAllConnectionsToSQLExplorer(); } } catch (Exception e) { log.error(e, e); } } /** * DOC bZhou Comment method "initWorkspace". */ private void initWorkspace() { // initialized resource persistence property. ResourceService.initResourcePersistence(); // MOD qiongli 2011-3-2 feature 17588.initilize all folder. initAllFolders(); } /** * DOC bZhou Comment method "initToolBar". */ private void initToolBar() { IToolBarManager toolBarManager = getViewSite().getActionBars().getToolBarManager(); toolBarManager.add(new RefreshDQReponsitoryViewAction()); } /** * MOD mzhao bug 8581 Add pre window close listener. */ private void addPostWindowCloseListener() { PlatformUI.getWorkbench().addWorkbenchListener(new IWorkbenchListener() { public void postShutdown(IWorkbench workbench) { // do nothing here until now } public boolean preShutdown(IWorkbench workbench, boolean forced) { // MOD zshen it is duplicate with initWorkspace() return true; } }); } /* * (non-Javadoc) * * @see org.eclipse.ui.navigator.CommonNavigator#createPartControl(org.eclipse .swt.widgets.Composite) */ @Override public void createPartControl(Composite parent) { parent.setLayout(new BorderLayout()); Composite topComp = new Composite(parent, SWT.NONE); topComp.setFont(parent.getFont()); topComp.setLayoutData(BorderLayout.NORTH); Composite bottomComp = new Composite(parent, SWT.NONE); bottomComp.setBackground(parent.getDisplay().getSystemColor(SWT.COLOR_LIST_BACKGROUND)); bottomComp.setFont(parent.getFont()); bottomComp.setLayoutData(BorderLayout.CENTER); topComp.setLayout(new BorderLayout()); FillLayout bottomLayout = new FillLayout(SWT.VERTICAL); bottomComp.setLayout(bottomLayout); createTreeFilter(topComp); super.createPartControl(bottomComp); // For removing the popup menu of DQRepositoryView. MenuManager menuMgr = new MenuManager("org.talend.dataprofiler.core.ui.views.DQRespositoryView"); //$NON-NLS-1$ menuMgr.setRemoveAllWhenShown(true); menuMgr.addMenuListener(new IMenuListener() { public void menuAboutToShow(IMenuManager menuManager) { ISelection selection = getCommonViewer().getSelection(); getNavigatorActionService().setContext(new ActionContext(selection)); getNavigatorActionService().fillContextMenu(menuManager); } }); Menu menu = menuMgr.createContextMenu(getCommonViewer().getTree()); getCommonViewer().getTree().setMenu(menu); this.addViewerFilter(EMFObjFilter.FILTER_ID); this.addViewerFilter(ReportingFilter.FILTER_ID); this.addViewerFilter(FolderObjFilter.FILTER_ID); adjustFilter(); activateContext(); getCommonViewer().setSorter(null); getCommonViewer().getTree().addTreeListener(new TreeAdapter() { @Override public void treeExpanded(TreeEvent e) { TreeItem item = (TreeItem) e.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$ } } super.treeExpanded(e); } }); getCommonViewer().getTree().addMouseListener(new MouseAdapter() { @Override public void mouseDoubleClick(MouseEvent e) { boolean superDoubleClick = true; Tree tree = (Tree) e.getSource(); Point point = new Point(e.x, e.y); final TreeItem item = tree.getItem(point); if (item != null) { Object obj = item.getData(); if (obj instanceof AbstractFolderNode) { AbstractFolderNode node = (AbstractFolderNode) obj; node.loadChildren(); Object[] children = node.getChildren(); if (children != null) { if (item.getText().indexOf("(") > 0) { //$NON-NLS-1$ item.setText(item.getText().substring(0, item.getText().indexOf("(")) + "(" + children.length //$NON-NLS-1$ //$NON-NLS-2$ + ")"); //$NON-NLS-1$ } else { item.setText(item.getText() + "(" + children.length + ")"); //$NON-NLS-1$ //$NON-NLS-2$ } } } if (obj instanceof IndicatorDefinition) { IndicatorDefinition indicatorDefinition = (IndicatorDefinition) obj; // reload object indicatorDefinition = DefinitionHandler.getInstance().getIndicatorDefinition( indicatorDefinition.getLabel()); IndicatorEditorInput input = new IndicatorEditorInput(indicatorDefinition); try { CorePlugin.getDefault().getWorkbench().getActiveWorkbenchWindow().getActivePage() .openEditor(input, IndicatorEditor.class.getName()); } catch (PartInitException e1) { log.error(e1, e1); } } if (obj instanceof DQRepositoryNode) { if (obj instanceof ReportFileRepNode) { new OpenItemEditorAction(new IRepositoryNode[] { (IRepositoryNode) obj }).run(); } else if (obj instanceof DFConnectionRepNode) { new EditFileDelimitedAction((IRepositoryNode) obj).run(); } else if (obj instanceof HadoopClusterConnectionRepNode && HadoopClusterUtils.getDefault().isServiceInstalled()) { new EditHadoopClusterAction((IRepositoryNode) obj).run(); } else if (obj instanceof HDFSOfHCConnectionNode && HadoopClusterUtils.getDefault().isServiceInstalled()) { new EditHDFSConnectionAction((IRepositoryNode) obj).run(); } else if (obj instanceof DFTableRepNode) { new EditDFTableAction((IRepositoryNode) obj).run(); } else { DQRepositoryNode repoNode = (DQRepositoryNode) obj; if (RepositoryNodeHelper.canOpenEditor(repoNode)) { OpenItemEditorAction openItemEditorAction = new OpenItemEditorAction( new IRepositoryNode[] { repoNode }); openItemEditorAction.run(); } if (repoNode instanceof AnalysisRepNode || repoNode instanceof ReportRepNode || repoNode instanceof SysIndicatorDefinitionRepNode || repoNode instanceof PatternRepNode || repoNode instanceof RuleRepNode) { superDoubleClick = false; } } } } if (superDoubleClick) { super.mouseDoubleClick(e); } } }); getCommonViewer().getTree().addKeyListener(new KeyListener() { public void keyPressed(KeyEvent e) { if (e.keyCode == SWT.CR || e.keyCode == SWT.KEYPAD_CR) { Tree tree = (Tree) e.getSource(); TreeItem[] selection = tree.getSelection(); for (TreeItem item : selection) { Object data = item.getData(); DQRepositoryNode repoNode = (DQRepositoryNode) data; if (RepositoryNodeHelper.canOpenEditor(repoNode)) { OpenItemEditorAction openItemEditorAction = new OpenItemEditorAction( new IRepositoryNode[] { repoNode }); openItemEditorAction.run(); } } } } public void keyReleased(KeyEvent e) { // do nothing here until now } }); // ~ADD mzhao for feature 6233 Load columns when selecting a table (or // view) in DQ Repository view getCommonViewer().addSelectionChangedListener(new ISelectionChangedListener() { public void selectionChanged(SelectionChangedEvent event) { TreeSelection selection = (TreeSelection) event.getSelection(); Iterator<?> iterator = selection.iterator(); while (iterator.hasNext()) { Object selectedElement = iterator.next(); if (selectedElement instanceof DBTableRepNode || selectedElement instanceof DBViewRepNode) { ((RepositoryNode) selectedElement).getChildren().get(0).getChildren(); } } } }); // MOD mzhao 2011-03-10 bug 19147: filter MDM entries. getCommonViewer().addFilter(new ViewerFilter() { @Override public boolean select(Viewer viewer, Object parentElement, Object element) { if (element instanceof IProject) { return false; } return true; } }); // ~ } /** * DOC gdbu Comment method "createTreeFilter". * * @param parent * @param _catalogToolBarMgr */ protected void createTreeFilter(final Composite parent) { Composite centerComp = new Composite(parent, SWT.NONE); centerComp.setFont(parent.getFont()); centerComp.setLayoutData(BorderLayout.CENTER); FillLayout fillLayout = new FillLayout(SWT.HORIZONTAL); fillLayout.marginHeight = 2; centerComp.setLayout(fillLayout); final Text filterText = new Text(centerComp, SWT.BORDER); filterText.setBackground(parent.getDisplay().getSystemColor(SWT.COLOR_LIST_BACKGROUND)); Composite eastComp = new Composite(parent, SWT.NONE); eastComp.setFont(parent.getFont()); eastComp.setLayoutData(BorderLayout.EAST); eastComp.setLayout(new FillLayout(SWT.HORIZONTAL)); final CoolBar coolBar = new CoolBar(eastComp, SWT.FLAT); CoolItem coolItem1 = new CoolItem(coolBar, SWT.FLAT); ToolBar toolBar = new ToolBar(coolBar, SWT.FLAT); ToolItem runFilterItem = new ToolItem(toolBar, SWT.FLAT); runFilterItem.setImage(ImageLib.getImage(ImageLib.FILTER_RUN)); runFilterItem.setToolTipText(DefaultMessagesImpl.getString("DQRespositoryView.RunFilter"));//$NON-NLS-1$ ToolItem previousMatchItem = new ToolItem(toolBar, SWT.FLAT); previousMatchItem.setImage(ImageLib.getImage(ImageLib.FILTER_UP)); previousMatchItem.setToolTipText(DefaultMessagesImpl.getString("DQRespositoryView.ShowPreviousMatch"));//$NON-NLS-1$ ToolItem nextMatchItem = new ToolItem(toolBar, SWT.FLAT); nextMatchItem.setImage(ImageLib.getImage(ImageLib.FILTER_DOWN)); nextMatchItem.setToolTipText(DefaultMessagesImpl.getString("DQRespositoryView.ShowNextMatch"));//$NON-NLS-1$ ToolItem closeFilterItem = new ToolItem(toolBar, SWT.FLAT); closeFilterItem.setImage(ImageLib.getImage(ImageLib.FILTER_CLOSE)); closeFilterItem.setToolTipText(DefaultMessagesImpl.getString("DQRespositoryView.CloseFilter"));//$NON-NLS-1$ toolBar.pack(); Point size = toolBar.getSize(); coolItem1.setControl(toolBar); coolItem1.setSize(coolItem1.computeSize(size.x, size.y)); coolItem1.setMinimumSize(size); coolBar.setLocked(true); runFilterItem.addSelectionListener(new SelectionAdapter() { /* * (non-Javadoc) * * @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse.swt.events.SelectionEvent) */ @Override public void widgetSelected(SelectionEvent e) { String filterStr = filterText.getText() + PluginConstant.EMPTY_STRING; Shell shell = filterText.getShell(); runFilter(filterStr, shell); } }); previousMatchItem.addSelectionListener(new SelectionAdapter() { /* * (non-Javadoc) * * @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse.swt.events.SelectionEvent) */ @Override public void widgetSelected(SelectionEvent e) { if (DQRepositoryNode.isOnFilterring()) { TreeItem[] selectionNode = getCommonViewer().getTree().getSelection(); if (0 == selectionNode.length) { IRepositoryNode filteredNode = RepositoryNodeHelper.getFilteredNode(); IRepositoryNode previousFilteredNode = RepositoryNodeHelper.getPreviouFilteredNode(filteredNode); if (null != previousFilteredNode) { RepositoryNodeHelper.setFilteredNode(previousFilteredNode); showSelectedElements(previousFilteredNode); } } else { TreeItem selectionTreeItem = selectionNode[(selectionNode.length - 1)]; IRepositoryNode repoNode = (IRepositoryNode) selectionTreeItem.getData(); IRepositoryNode previousFilteredNode = RepositoryNodeHelper.getPreviouFilteredNode(repoNode); if (null != previousFilteredNode) { RepositoryNodeHelper.setFilteredNode(previousFilteredNode); // showSelectedElements((RepositoryNode) previousFilteredNode); DQRepositoryNode.setOnDisplayNextOrPreviousNode(true); StructuredSelection structSel = new StructuredSelection(previousFilteredNode); getCommonViewer().setSelection(structSel); DQRepositoryNode.setOnDisplayNextOrPreviousNode(false); } } } } }); nextMatchItem.addSelectionListener(new SelectionAdapter() { /* * (non-Javadoc) * * @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse.swt.events.SelectionEvent) */ @Override public void widgetSelected(SelectionEvent e) { if (DQRepositoryNode.isOnFilterring()) { TreeItem[] selectionNode = getCommonViewer().getTree().getSelection(); if (0 == selectionNode.length) { IRepositoryNode filteredNode = RepositoryNodeHelper.getFilteredNode(); IRepositoryNode nextFilteredNode = RepositoryNodeHelper.getNextFilteredNode(filteredNode); if (null != nextFilteredNode) { RepositoryNodeHelper.setFilteredNode(nextFilteredNode); showSelectedElements(nextFilteredNode); } } else { TreeItem selectionTreeItem = selectionNode[(selectionNode.length - 1)]; IRepositoryNode repoNode = (IRepositoryNode) selectionTreeItem.getData(); IRepositoryNode nextFilteredNode = RepositoryNodeHelper.getNextFilteredNode(repoNode); if (null != nextFilteredNode) { RepositoryNodeHelper.setFilteredNode(nextFilteredNode); // showSelectedElements((RepositoryNode) nextFilteredNode); DQRepositoryNode.setOnDisplayNextOrPreviousNode(true); getCommonViewer().expandToLevel(nextFilteredNode, 1); StructuredSelection structSel = new StructuredSelection(nextFilteredNode); getCommonViewer().setSelection(structSel); DQRepositoryNode.setOnDisplayNextOrPreviousNode(false); } } } } }); closeFilterItem.addSelectionListener(new SelectionAdapter() { /* * (non-Javadoc) * * @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse.swt.events.SelectionEvent) */ @Override public void widgetSelected(SelectionEvent e) { if (DQRepositoryNode.isOnFilterring()) { closeFilterStatus(filterText); } } }); filterText.addKeyListener(new KeyAdapter() { /* * (non-Javadoc) * * @see org.eclipse.swt.events.KeyAdapter#keyPressed(org.eclipse.swt.events.KeyEvent) */ @Override public void keyPressed(KeyEvent e) { if (e.keyCode == SWT.CR || e.keyCode == SWT.KEYPAD_CR) { String filterStr = filterText.getText() + PluginConstant.EMPTY_STRING; Shell shell = filterText.getShell(); runFilter(filterStr, shell); } } /* * (non-Javadoc) * * @see org.eclipse.swt.events.KeyAdapter#keyReleased(org.eclipse.swt.events.KeyEvent) */ @Override public void keyReleased(KeyEvent e) { if (DQRepositoryNode.isOnFilterring()) { if (e.keyCode == SWT.BS || e.keyCode == SWT.DEL) { if (isFilterTextEmpty(filterText)) { new UIJob(PluginConstant.EMPTY_STRING) { @Override public IStatus runInUIThread(IProgressMonitor monitor) { if (isFilterTextEmpty(filterText)) { closeFilterStatus(filterText); } return Status.OK_STATUS; } }.schedule(2000); } } } } }); } private void closeFilterStatus(Text filterText) { RepositoryNodeHelper.setFilteredNode(null); DQRepositoryNode.setFilterStr(PluginConstant.EMPTY_STRING); DQRepositoryNode.setFiltering(false); filterText.setText(PluginConstant.EMPTY_STRING); getCommonViewer().collapseAll(); refresh(); } private boolean isFilterTextEmpty(Text filterText) { String filterString = filterText.getText().trim() + PluginConstant.EMPTY_STRING; if (filterString.equals(PluginConstant.EMPTY_STRING)) { return true; } else { return false; } } /** * * DOC gdbu DQRespositoryView class global comment. Detailled comment */ class RunFilterThread extends Thread { private Shell shell = null; private String filterStr = null; public RunFilterThread(String filterStr, Shell shell) { this.shell = shell; this.filterStr = filterStr; } @Override public void run() { Display.getDefault().asyncExec(new Runnable() { public void run() { ProgressDialog progressDialog = new ProgressDialog(shell) { @Override public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException { monitor.beginTask("Filtering...", 11); //$NON-NLS-1$ getCommonViewer().collapseAll(); monitor.worked(1); try { DQRepositoryNode.setFilterStr(filterStr); if (filterStr.trim().equals(PluginConstant.EMPTY_STRING)) { DQRepositoryNode.setFiltering(false); } else { DQRepositoryNode.setFiltering(true); RepositoryNodeHelper.fillTreeList(monitor); } } catch (Exception exception) { log.error(exception, exception); } finally { final IRepositoryNode firstFilteredNode = RepositoryNodeHelper.getFirstFilteredNode(); if (null != firstFilteredNode) { RepositoryNodeHelper.setFilteredNode(firstFilteredNode); monitor.worked(1); showSelectedElements(firstFilteredNode); monitor.worked(1); } monitor.done(); } } }; try { progressDialog.executeProcess(); } catch (InvocationTargetException e) { log.error(e, e); } catch (InterruptedException e) { log.error(e, e); } } }); } } private void runFilter(final String filterStr, final Shell shell) { RunFilterThread runFilterThread = new RunFilterThread(filterStr, shell); runFilterThread.run(); } static class ViewColumnViewerToolTipSupport extends ColumnViewerToolTipSupport { protected ViewColumnViewerToolTipSupport(ColumnViewer viewer, int style, boolean manualActivation) { super(viewer, style, manualActivation); } @Override protected Composite createViewerToolTipContentArea(Event event, ViewerCell cell, Composite parent) { final Composite composite = new Composite(parent, SWT.NONE); composite.setLayout(new RowLayout(SWT.VERTICAL)); Text text = new Text(composite, SWT.SINGLE); text.setText(getText(event)); text.setSize(100, 60); DateTime calendar = new DateTime(composite, SWT.CALENDAR); calendar.setEnabled(false); calendar.setSize(100, 100); composite.pack(); return composite; } public static final void enableFor(final ColumnViewer viewer) { new ViewColumnViewerToolTipSupport(viewer, ToolTip.NO_RECREATE, false); } } /** * Activate a context that this view uses. It will be tied to this view activation events and will be removed when * the view is disposed. */ private void activateContext() { IContextService contextService = (IContextService) getSite().getService(IContextService.class); contextService.activateContext(VIEW_CONTEXT_ID); } private void adjustFilter() { List<IService> filterList = GlobalServiceRegister.getDefault().getServiceGroup(IViewerFilterService.class); for (IService service : filterList) { if (service instanceof IViewerFilterService) { IViewerFilterService filterService = (IViewerFilterService) service; if (filterService.isAddOrDel()) { this.addViewerFilter(filterService.getViwerFilterId()); } else { this.removeViewerFilter(filterService.getViwerFilterId()); } } } } public void addViewerFilter(int viewerFilterId) { if (filterMap.containsKey(String.valueOf(viewerFilterId))) { return; } AbstractViewerFilter filter = null; switch (viewerFilterId) { case EMFObjFilter.FILTER_ID: filter = new EMFObjFilter(); filterMap.put(String.valueOf(EMFObjFilter.FILTER_ID), filter); break; case ReportingFilter.FILTER_ID: filter = new ReportingFilter(); filterMap.put(String.valueOf(ReportingFilter.FILTER_ID), filter); break; case FolderObjFilter.FILTER_ID: filter = new FolderObjFilter(); filterMap.put(String.valueOf(FolderObjFilter.FILTER_ID), filter); break; default: filter = new ReportingFilter(); filterMap.put(String.valueOf(ReportingFilter.FILTER_ID), filter); } getCommonViewer().addFilter(filter); } public void removeViewerFilter(int viewerFilterId) { String filterKey = String.valueOf(viewerFilterId); if (filterMap.containsKey(filterKey)) { this.getCommonViewer().removeFilter(filterMap.get(filterKey)); this.filterMap.remove(filterKey); } } /** * DOC Zqin Comment method "showSelectedElements". * * MOD 2009-01-07 mzhao for feature:0005664 * * @param newTree */ public void showSelectedElements(Object selectedElement) { try { // MOD by zshen for bug 12940 refresh the viewer to collapse all the element. StructuredSelection structSel = new StructuredSelection(selectedElement); getCommonViewer().setSelection(structSel); // If not select,unfold tree structure to this column. StructuredSelection selectionTarge = (StructuredSelection) getCommonViewer().getSelection(); if (!selectionTarge.equals(structSel)) { getCommonViewer().refresh(); StructuredSelection recursiveExpandTree = recursiveExpandTree(selectedElement); if (recursiveExpandTree != null) { structSel = recursiveExpandTree; } getCommonViewer().setSelection(structSel); } this.setFocus(); } catch (Exception e) { log.error(e, e); } } /** * * DOC mzhao Comment method "recursiveExpandTree". * * @param commonViewer * @param provider * @param item */ private StructuredSelection recursiveExpandTree(Object item) { if (contentProvider == null) { contentProvider = (ITreeContentProvider) getCommonViewer().getContentProvider(); } // MOD xqliu 2011-01-14 bug 15750: show in DQ Repository View if (item instanceof RepositoryNode) { // RepositoryNode node = ((RepositoryNode) item).getParent(); // if (node == null) { RepositoryNode recursiveFind = findRealNode(item); if (recursiveFind == null) { return null; } RepositoryNode node = recursiveFind.getParent(); // } recursiveExpandTree(node); getCommonViewer().expandToLevel(node, 1); return new StructuredSelection(recursiveFind); } return null; } /** * Because the exist for filter on the repositoryView we maybe use a temp node to display so we need to find out * real one at here. * * @param item * @return */ private RepositoryNode findRealNode(Object item) { ModelElement modelElementFromRepositoryNode = RepositoryNodeHelper .getModelElementFromRepositoryNode((RepositoryNode) item); if (modelElementFromRepositoryNode == null) {// for root node case return null; } RepositoryNode recursiveFind = RepositoryNodeHelper.recursiveFind(modelElementFromRepositoryNode); if (recursiveFind == null) { log.warn(DefaultMessagesImpl.getString("DQRepositoryView.nodeNotExistWarring", //$NON-NLS-1$ modelElementFromRepositoryNode.getName())); MessageDialog.openWarning(null, DefaultMessagesImpl.getString("DQRepositoryView.nodeNotExistWarring.Title"), //$NON-NLS-1$ DefaultMessagesImpl.getString("DQRepositoryView.nodeNotExistWarring", //$NON-NLS-1$ modelElementFromRepositoryNode.getName())); return null; } return recursiveFind; } /** * DOC bZhou DQRespositoryView class global comment. Detailled comment */ class RefreshDQReponsitoryViewAction extends RefreshAction { public RefreshDQReponsitoryViewAction() { super(PlatformUI.getWorkbench().getActiveWorkbenchWindow()); setImageDescriptor(ImageLib.getImageDescriptor(ImageLib.REFRESH_SPACE)); } @Override public void run() { RepositoryWorkUnit repositoryWorkUnit = new RepositoryWorkUnit(ProjectManager.getInstance().getCurrentProject(), "refresh DQ Reponsitory View") { //$NON-NLS-1$ @Override protected void run() throws LoginException, PersistenceException { // equals super.run() // new RefreshAction(PlatformUI.getWorkbench().getActiveWorkbenchWindow()).run(); CorePlugin.getDefault().refreshWorkSpace(); ProxyRepositoryManager.getInstance().refresh(); getCommonViewer().refresh(); } }; // TDQ-12262: set to false, because for git remote project, when the item file is updated, need to unload. repositoryWorkUnit.setAvoidUnloadResources(false); ProxyRepositoryFactory.getInstance().executeRepositoryWorkUnit(repositoryWorkUnit); try { repositoryWorkUnit.throwPersistenceExceptionIfAny(); } catch (PersistenceException e) { log.error(e); } } } public void refresh() { new RefreshDQReponsitoryViewAction().run(); } @Override protected void handleDoubleClick(DoubleClickEvent anEvent) { IStructuredSelection selection = (IStructuredSelection) anEvent.getSelection(); Object element = selection.getFirstElement(); RepositoryNode repoNode = (RepositoryNode) element; if (repoNode.canExpandForDoubleClick()) { super.handleDoubleClick(anEvent); } } /** * * DOC qiongli Comment method "initAllFolder". */ private void initAllFolders() { Project newProject = ProjectManager.getInstance().getCurrentProject(); List<FolderItem> folderItems = ProjectManager.getInstance().getFolders(newProject.getEmfProject()); try { for (FolderItem folder : new ArrayList<FolderItem>(folderItems)) { if (WorkbenchUtils.isTDQOrMetadataRootFolder(folder, ProjectManager.getInstance().getCurrentProject() .getEmfProject())) { ERepositoryObjectType type = WorkbenchUtils.getFolderContentType(folder); // MOD by zshen to avoid NullPointerException. if (type != null) { ProxyRepositoryFactory.getInstance().getAll(type, true); } } } } catch (PersistenceException e) { log.error(e, e); } } }