// ============================================================================
//
// 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.cwm.compare.ui.views;
import java.util.ArrayList;
import java.util.List;
import org.apache.log4j.Logger;
import org.eclipse.compare.CompareConfiguration;
import org.eclipse.compare.structuremergeviewer.DiffElement;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.jface.action.IMenuListener;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.swt.events.KeyEvent;
import org.eclipse.swt.events.KeyListener;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.events.MouseListener;
import org.eclipse.swt.widgets.Composite;
import org.talend.cwm.compare.ui.actions.SubelementCompareAction;
import orgomg.cwm.objectmodel.core.ModelElement;
import orgomg.cwm.objectmodel.core.Package;
import orgomg.cwm.resource.relational.ColumnSet;
/**
* DOC mzhao class global comment. Detailled comment
*/
@SuppressWarnings("restriction")
// public class CompareModelContentMergeViewer extends ModelContentMergeViewer {
public class CompareModelContentMergeViewer {
private static final int KEY_CODE_C = 99;
private static final int KEY_CODE_T = 116;
private static final int KEY_CODE_V = 118;
private static Logger log = Logger.getLogger(CompareModelContentMergeViewer.class);
private Object selectedOjbect = null;
// private ModelContentMergeDiffTab diffTabLeft = null;
//
// private ModelContentMergeDiffTab diffTabRight = null;
public CompareModelContentMergeViewer(Composite parent, CompareConfiguration config, Object selObj) {
// super(parent, config);
selectedOjbect = selObj;
// MOD mzhao feature 8227
// diffTabLeft = (ModelContentMergeDiffTab) leftPart.getTreePart();
// diffTabRight = (ModelContentMergeDiffTab) rightPart.getTreePart();
// diffTabLeft.setComparator(new ViewerComparator());
// diffTabRight.setComparator(new ViewerComparator());
}
public void hookContextMenu(boolean compareEachOther) {
if (!compareEachOther) {
MenuManager menuMgr = new MenuManager("#PopupMenu", "contextMenu");//$NON-NLS-1$ //$NON-NLS-2$
menuMgr.setRemoveAllWhenShown(true);
menuMgr.addMenuListener(new IMenuListener() {
@Override
public void menuAboutToShow(IMenuManager manager) {
// manager.add(new GroupMarker(IWorkbenchActionConstants.MB_ADDITIONS));
// IStructuredSelection selection = (IStructuredSelection) diffTabLeft.getSelection();
// EObject selectedElement = null;
// if (selection.toList().size() == 1) {
// selectedElement = (EObject) selection.getFirstElement();
// if (selectedElement instanceof Package) {
// if (isMuitLevelStructor((Package) selectedElement)) {
// return;
// }
// SubelementCompareAction subEleCompTableAction = new SubelementCompareAction(Messages
// .getString("CompareModelContentMergeViewer.CompareListOfTables"), //$NON-NLS-1$
// diffTabLeft, selectedOjbect, SubelementCompareAction.TABLE_COMPARE);
// SubelementCompareAction subEleCompViewAction = new SubelementCompareAction(Messages
// .getString("CompareModelContentMergeViewer.CompareListOfViews"), //$NON-NLS-1$
// diffTabLeft, selectedOjbect, SubelementCompareAction.VIEW_COMPARE);
// manager.add(subEleCompTableAction);
// manager.add(subEleCompViewAction);
// } else if (selectedElement instanceof ColumnSet) {
// addRenameMenuAction(manager, selectedElement);
// SubelementCompareAction subEleCompColumnAction = new SubelementCompareAction(
// Messages.getString("CompareModelContentMergeViewer.CompareListOfColumns"), diffTabLeft, selectedOjbect, //$NON-NLS-1$
// SubelementCompareAction.COLUMN_COMPARE);
// manager.add(subEleCompColumnAction);
// } else if (selectedElement instanceof TdColumn) {
// addRenameMenuAction(manager, selectedElement);
// }
//
// }
}
});
// Menu menu = menuMgr.createContextMenu(diffTabLeft.getControl());
// diffTabLeft.getControl().setMenu(menu);
// CompareUIPlugin.getActiveWorkbenchWindow().getActivePage().getActiveEditor().getSite()
// .registerContextMenu(menuMgr, diffTabLeft);
// Add key shortcut
// diffTabLeft.getTree().addKeyListener(new CompareKeyListener());
// diffTabLeft.getTree().addMouseListener(new CompareMouseListener());
}
}
/**
* DOC bZhou Comment method "hookToolBar".
*
* @param compareEachOther
*/
public void hookToolBar(boolean compareEachOther) {
// IToolBarManager tbm = getToolBarManager(getControl().getParent());
// IContributionItem[] icItems = tbm.getItems();
// for (IContributionItem conbItem : icItems) {
// if (conbItem instanceof ActionContributionItem) {
// IAction action = ((ActionContributionItem) conbItem).getAction();
//
// if (action != null) {
// String actionId = action.getActionDefinitionId();
// if (compareEachOther && COPY_RIGHT_TO_LEFT_ID.equals(actionId)) {
// tbm.remove(conbItem);
// conbItem.dispose();
// }
// }
// }
// }
//
// tbm.update(true);
}
private List<DiffElement> getDiffElementList() {
List<DiffElement> diffElementList = new ArrayList<DiffElement>();
// recursive to add diff element.
// DiffModel diffModel = (DiffModel) ((ModelCompareInput) getInput()).getDiff();
// EList<DiffElement> diffElements = diffModel.getOwnedElements();
// for (DiffElement diffEle : diffElements) {
// getDiffElements(diffEle, diffElementList);
// }
return diffElementList;
}
private List<ModelElement> getChangedList() {
List<ModelElement> changedLists = new ArrayList<ModelElement>();
List<DiffElement> diffElementList = getDiffElementList();
// for (DiffElement diffEle : diffElementList) {
// if (diffEle instanceof ModelElementChangeRightTarget) {
// changedLists.add((ModelElement) ((ModelElementChangeRightTarget) diffEle).getRightElement());
// } else if (diffEle instanceof UpdateAttribute) {
// changedLists.add((ModelElement) ((UpdateAttribute) diffEle).getRightElement());
// }
// }
return changedLists;
}
private void addRenameMenuAction(IMenuManager manager, EObject selectedElement) {
List<ModelElement> changedList = getChangedList();
List<DiffElement> diffElementList = getDiffElementList();
// Add rename element action.
// for (DiffElement diffEle : diffElementList) {
// if (diffEle instanceof UpdateAttribute) {
// if (((UpdateAttribute) diffEle).getLeftElement() == selectedElement) {
// // Add action menu
// RenameComparedElementAction renameComparedElementAction = new RenameComparedElementAction(
// (IFolderNode) selectedOjbect, (ModelElement) selectedElement, changedList);
// manager.add(renameComparedElementAction);
// return;
// }
// } else if (diffEle instanceof ModelElementChangeLeftTarget) {
// if (((ModelElementChangeLeftTarget) diffEle).getLeftElement() == selectedElement) {
// // Add action menu
// RenameComparedElementAction renameComparedElementAction = new RenameComparedElementAction(
// (IFolderNode) selectedOjbect, (ModelElement) selectedElement, changedList);
// manager.add(renameComparedElementAction);
// return;
// }
// }
// }
}
/**
*
* DOC mzhao CompareModelContentMergeViewer class global comment. Detailled comment
*/
private class CompareKeyListener implements KeyListener {
@Override
public void keyPressed(KeyEvent e) {
// IStructuredSelection selection = (IStructuredSelection) diffTabLeft.getSelection();
EObject selectedElement = null;
// if (selection.toList().size() == 1) {
// selectedElement = (EObject) selection.getFirstElement();
// }
switch (e.keyCode) {
case KEY_CODE_T:
if (selectedElement != null && selectedElement instanceof Package) {
performCompareAction(selectedElement, SubelementCompareAction.TABLE_COMPARE);
}
break;
case KEY_CODE_V:
if (selectedElement != null && selectedElement instanceof Package) {
performCompareAction(selectedElement, SubelementCompareAction.VIEW_COMPARE);
}
break;
case KEY_CODE_C:
if (selectedElement != null && selectedElement instanceof ColumnSet) {
performCompareAction(selectedElement, SubelementCompareAction.COLUMN_COMPARE);
}
break;
default:
break;
}
}
@Override
public void keyReleased(KeyEvent e) {
// needn't to do anything ???
}
}
/**
*
* DOC mzhao CompareModelContentMergeViewer class global comment. Detailled comment
*/
private class CompareMouseListener implements MouseListener {
@Override
public void mouseDoubleClick(MouseEvent e) {
// IStructuredSelection selection = (IStructuredSelection) diffTabLeft.getSelection();
EObject selectedElement = null;
// if (selection.toList().size() == 1) {
// selectedElement = (EObject) selection.getFirstElement();
// if (selectedElement != null) {
// performCompareAction(selectedElement, SubelementCompareAction.TABLE_COMPARE);
// }
// }
}
@Override
public void mouseDown(MouseEvent e) {
// needn't to do anything ???
}
@Override
public void mouseUp(MouseEvent e) {
// needn't to do anything ???
}
}
private void performCompareAction(EObject selectedElement, int tableOrViewCompare) {
List<DiffElement> diffElementList = getDiffElementList();
for (DiffElement diffEle : diffElementList) {
// if (diffEle instanceof UpdateAttribute) {
// if (((UpdateAttribute) diffEle).getLeftElement() == selectedElement) {
// return;
// }
// } else if (diffEle instanceof ModelElementChangeLeftTarget) {
// if (((ModelElementChangeLeftTarget) diffEle).getLeftElement() == selectedElement) {
// return;
// }
// }
}
SubelementCompareAction subEleCompColumnAction = null;
// if (selectedElement instanceof Package) {
// if (isMuitLevelStructor((Package) selectedElement)) {
// return;
// }
// subEleCompColumnAction = new SubelementCompareAction(
// tableOrViewCompare == SubelementCompareAction.TABLE_COMPARE ? Messages
// .getString("CompareModelContentMergeViewer.CompareListOfTable") //$NON-NLS-1$
// : Messages.getString("CompareModelContentMergeViewer.CompareListOfVeiw"), diffTabLeft, selectedOjbect, tableOrViewCompare); //$NON-NLS-1$
// } else if (selectedElement instanceof ColumnSet) {
// subEleCompColumnAction = new SubelementCompareAction(
// Messages.getString("CompareModelContentMergeViewer.CompareListOfColumn"), diffTabLeft, selectedOjbect, //$NON-NLS-1$
// SubelementCompareAction.COLUMN_COMPARE);
// }
if (subEleCompColumnAction != null) {
subEleCompColumnAction.run();
}
}
private void getDiffElements(DiffElement diffEle, List<DiffElement> diffElementList) {
// if (diffEle instanceof DiffGroup) {
// for (DiffElement subDiffEle : ((DiffGroup) diffEle).getSubDiffElements()) {
// getDiffElements(subDiffEle, diffElementList);
// }
// } else {
// diffElementList.add(diffEle);
// }
}
// @Override
// protected void createToolItems(ToolBarManager tbm) {
//
// // NEXT DIFF
// final Action nextDiff = new AbstractCompareAction(ResourceBundle.getBundle(BUNDLE_NAME), "action.NextDiff.") { //$NON-NLS-1$
//
// @Override
// public void run() {
// navigate(true);
// }
// };
// final ActionContributionItem nextDiffContribution = new ActionContributionItem(nextDiff);
// nextDiffContribution.setVisible(true);
// tbm.appendToGroup("navigation", nextDiffContribution); //$NON-NLS-1$
// // PREVIOUS DIFF
// final Action previousDiff = new AbstractCompareAction(ResourceBundle.getBundle(BUNDLE_NAME), "action.PrevDiff.") { //$NON-NLS-1$
//
// @Override
// public void run() {
// navigate(false);
// }
// };
// final ActionContributionItem previousDiffContribution = new ActionContributionItem(previousDiff);
// previousDiffContribution.setVisible(true);
// tbm.appendToGroup("navigation", previousDiffContribution); //$NON-NLS-1$
//
// IContributionItem[] icItems = tbm.getItems();
// for (IContributionItem conbItem : icItems) {
//
// if (conbItem instanceof ActionContributionItem) {
//
// IAction action = ((ActionContributionItem) conbItem).getAction();
// if (action != null) {
// String actionId = action.getActionDefinitionId();
//
// if (action instanceof ChangePropertyAction) {
// tbm.remove(conbItem);
// conbItem.dispose();
// }
//
// if (COPY_LEFT_TO_RIGHT_ID.equals(actionId)) {
// tbm.remove(conbItem);
// conbItem.dispose();
// }
// }
// }
//
// }
// tbm.update(true);
// // ~
// }
// @Override
// protected void copy(boolean leftToRight) {
// // Added yyin 20130131 TDQ-6780, warn the user to check the compare result before copy
// boolean isContinue = MessageUI.openYesNoQuestion(Messages.getString("CompareModelContentMergeViewer.IsContinueCopy"));//$NON-NLS-1$
// if (!isContinue) {
// return;
// }// ~
// // First check dependencies.
// ModelElement modelElement = null;
// IFile resourceFile = null;
// // File
// if (selectedOjbect instanceof IFile) {
// modelElement = PrvResourceFileHelper.getInstance().findProvider((IFile) selectedOjbect);
// } else if (selectedOjbect instanceof IRepositoryViewObject) {
// // MOD klliu 2010-10-08 bug 16173: get changes in "database compare" editor
// modelElement = PropertyHelper.getModelElement(((IRepositoryViewObject) selectedOjbect).getProperty());
// } else if (selectedOjbect instanceof Connection) {
// // TDQ-7600 20130717 yyin:add judgement for connection type(sometimes from TDQCompareService will give this
// // type of object
// modelElement = (ModelElement) selectedOjbect;
// } else {
// // Folder
// // MOD msjian 2011-5-20 20875:Change to model element
// IRepositoryNode parentNode = DBTableRepNode.getParentPackageNode((IRepositoryNode) selectedOjbect);
// Package ctatlogSwtich = parentNode instanceof DBCatalogRepNode ? ((DBCatalogRepNode) parentNode).getCatalog() :
// null;
// if (ctatlogSwtich == null) {
// ctatlogSwtich = parentNode instanceof DBSchemaRepNode ? ((DBSchemaRepNode) parentNode).getSchema() : null;
// }
// // ~
// if (ctatlogSwtich != null) {
// resourceFile = PrvResourceFileHelper.getInstance().findCorrespondingFile(
// ConnectionHelper.getTdDataProvider(ctatlogSwtich));
// modelElement = ConnectionHelper.getTdDataProvider(ctatlogSwtich);
// }
// ColumnSet columnSet = parentNode instanceof DBTableRepNode ? ((DBTableRepNode) parentNode).getTdTable() : null;
// if (columnSet != null) {
// resourceFile = PrvResourceFileHelper.getInstance().findCorrespondingFile(
// ConnectionHelper.getDataProvider(columnSet));
// modelElement = ConnectionHelper.getDataProvider(columnSet);
// }
// }
//
// int diffItemsCount = ((ModelCompareInput) getInput()).getDiffAsList().size();
// try {
// super.copy(leftToRight);
// // MOD klliu 2011-03-01 bug 17506
// ModelCompareInput modelCompareInput = (ModelCompareInput) getInput();
// if (!leftToRight && modelCompareInput.getDiffAsList().size() == 0) {
// Resource leftResource = modelCompareInput.getLeftResource();
// XmiResourceManager resourceManager = ProxyRepositoryFactory.getInstance().getRepositoryFactoryFromProvider()
// .getResourceManager();
// resourceManager.saveResource(leftResource);
// // refactor the input
// final MatchModel match = (MatchModel) modelCompareInput.getMatch();
// match.getUnmatchedElements().clear();
// final ComparisonResourceSnapshot snap = DiffFactory.eINSTANCE.createComparisonResourceSnapshot();
// snap.setDiff((DiffModel) ((ModelCompareInput) getInput()).getDiff());
// snap.setMatch((MatchModel) ((ModelCompareInput) getInput()).getMatch());
// configuration.setProperty(EMFCompareConstants.PROPERTY_CONTENT_INPUT_CHANGED, snap);
// }
// // MOD mzhao 2009-03-11 copy from right to left.need reload the
// // currently selected element.
// if (!leftToRight && diffItemsCount > 0) {
// // MOD yyi 2011-05-16 21512:need to reload the db connection element
// // MOD 20130311 TDQ-6999: pass a text for compare special, then no popup dialog from compare yyin
// if (selectedOjbect instanceof RepositoryViewObject) {
// new ReloadDatabaseAction(((RepositoryViewObject) selectedOjbect).getRepositoryNode(),
// Messages.getString("CompareModelContentMergeViewer.NoNeedToPopupReload"), false).run();
// } else {
// // MOD msjian 2011-5-20 20875:do copy for table list
// new ReloadDatabaseAction(selectedOjbect,
// Messages.getString("CompareModelContentMergeViewer.NoNeedToPopupReload"), false).run();
// }
// }
// } catch (Throwable e) {
// log.error(e.getMessage(), e);
// }
// }
// private boolean isMuitLevelStructor(Package current) {
// if (current instanceof Catalog) {
// List<Schema> schemas = CatalogHelper.getSchemas((Catalog) current);
// if (schemas.size() > 0) {
// return true;
// }
// }
// return false;
// }
private static final String COPY_LEFT_TO_RIGHT_ID = "org.eclipse.compare.copyAllLeftToRight"; //$NON-NLS-1$
private static final String COPY_RIGHT_TO_LEFT_ID = "org.eclipse.compare.copyAllRightToLeft"; //$NON-NLS-1$
}