// ============================================================================ // // Copyright (C) 2006-2012 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.designer.core.ui.views.properties; import java.lang.reflect.InvocationTargetException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.apache.commons.collections.BidiMap; import org.apache.commons.collections.bidimap.DualHashBidiMap; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.gef.commands.CommandStack; import org.eclipse.gef.commands.CommandStackEvent; import org.eclipse.gef.commands.CommandStackEventListener; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.ScrolledComposite; import org.eclipse.swt.layout.FormAttachment; import org.eclipse.swt.layout.FormData; import org.eclipse.swt.layout.FormLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Event; import org.eclipse.swt.widgets.Listener; import org.eclipse.ui.internal.dialogs.EventLoopProgressMonitor; import org.eclipse.ui.views.properties.tabbed.ITabbedPropertyConstants; import org.talend.commons.exception.PersistenceException; import org.talend.commons.ui.runtime.exception.ExceptionHandler; import org.talend.commons.ui.swt.dialogs.ProgressDialog; import org.talend.commons.utils.threading.ExecutionLimiter; import org.talend.core.context.RepositoryContext; import org.talend.core.language.ECodeLanguage; import org.talend.core.language.ICodeProblemsChecker; import org.talend.core.model.general.Project; import org.talend.core.model.metadata.IMetadataTable; import org.talend.core.model.metadata.builder.ConvertionHelper; import org.talend.core.model.metadata.builder.connection.Connection; import org.talend.core.model.metadata.builder.connection.DatabaseConnection; import org.talend.core.model.process.EComponentCategory; import org.talend.core.model.process.EConnectionType; import org.talend.core.model.process.EParameterFieldType; import org.talend.core.model.process.Element; import org.talend.core.model.process.IElementParameter; import org.talend.core.model.process.Problem; import org.talend.core.model.properties.ConnectionItem; import org.talend.core.model.properties.FileItem; import org.talend.core.model.properties.Item; import org.talend.core.model.properties.LinkRulesItem; import org.talend.core.model.repository.ERepositoryObjectType; import org.talend.core.model.repository.IRepositoryViewObject; import org.talend.core.properties.tab.IDynamicProperty; import org.talend.cwm.helper.ConnectionHelper; import org.talend.designer.core.DesignerPlugin; import org.talend.designer.core.i18n.Messages; import org.talend.designer.core.model.components.EParameterName; import org.talend.designer.core.model.metadata.RepositoryObjectHelper; import org.talend.designer.core.ui.AbstractMultiPageTalendEditor; import org.talend.designer.core.ui.editor.cmd.ChangeMetadataCommand; import org.talend.designer.core.ui.editor.nodes.Node; import org.talend.designer.core.ui.editor.process.Process; import org.talend.designer.core.ui.editor.properties.controllers.AbstractElementPropertySectionController; import org.talend.designer.core.ui.editor.properties.controllers.GroupController; import org.talend.designer.core.ui.editor.subjobcontainer.SubjobContainer; import org.talend.designer.runprocess.IRunProcessService; import org.talend.repository.ProjectManager; import org.talend.repository.model.ERepositoryStatus; import org.talend.repository.model.IProxyRepositoryFactory; /** * yzhang class global comment. Detailled comment <br/> * * $Id: DynamicTabbedPropertySection.java 6579 2007-10-26 10:33:01Z ftang $ * */ public class MultipleThreadDynamicComposite extends ScrolledComposite implements IDynamicProperty { protected AbstractMultiPageTalendEditor part; protected Element elem; protected Composite parent; protected BidiMap hashCurControls; protected String currentComponent; protected EComponentCategory section; protected int curRowSize; protected DynamicPropertyGenerator generator; private Map<String, FileItem> repositoryFileItemMap = new HashMap<String, FileItem>(); // hywang add for 6484 private Map<String, LinkRulesItem> repositoryLinkRulesItemMap = new HashMap<String, LinkRulesItem>(); // hywang add // for 6484 /* cache should be deleted ,bug 16969 */ // private final Map<String, Query> repositoryQueryStoreMap; // private final Map<String, IMetadataTable> repositoryTableMap; private Map<String, String> tableIdAndDbTypeMap = new HashMap<String, String>(); private Map<String, String> tableIdAndDbSchemaMap = new HashMap<String, String>(); private boolean forceRedraw; private int lastCompositeSize = 0; private Process process; private boolean propertyResized; protected Composite composite; private final String updataComponentParamName; private boolean isCompactView; WidgetFactory widgetFactory = new WidgetFactory(); public String getRepositoryAliasName(ConnectionItem connectionItem) { String aliasName = RepositoryObjectHelper.getRepositoryAliasName(connectionItem); return aliasName != null ? aliasName : ""; //$NON-NLS-1$ } /** * * cli Comment method "getAllRepositoryMetadata". * * fixed for 8971 */ private List<IRepositoryViewObject> getAllRepositoryMetadata() { IProxyRepositoryFactory factory = DesignerPlugin.getDefault().getProxyRepositoryFactory(); ProjectManager pManager = ProjectManager.getInstance(); pManager.getReferencedProjects(); // retrieve reference project. List<IRepositoryViewObject> repositoryObjects; try { repositoryObjects = retrieveMetadataFromProject(factory, pManager, pManager.getCurrentProject()); } catch (PersistenceException e) { throw new RuntimeException(e); } return repositoryObjects; } /** * * cli Comment method "getAllRepositoryMetadata". * * fixed for 8971 */ private List<IRepositoryViewObject> retrieveMetadataFromProject(IProxyRepositoryFactory factory, ProjectManager pManager, Project parentProject) throws PersistenceException { List<IRepositoryViewObject> repositoryObjects = factory.getAll(parentProject, ERepositoryObjectType.METADATA); if (repositoryObjects == null) { repositoryObjects = new ArrayList<IRepositoryViewObject>(); } List<Project> referencedProjects = pManager.getReferencedProjects(parentProject); if (referencedProjects != null) { for (Project p : referencedProjects) { List<IRepositoryViewObject> refRepObjects = retrieveMetadataFromProject(factory, pManager, p); if (refRepObjects != null) { repositoryObjects.addAll(refRepObjects); } } } return repositoryObjects; } public void updateRepositoryList() { ProgressDialog progressDialog = new ProgressDialog(this.getShell(), 1000) { private IProgressMonitor monitorWrap; @Override public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException { monitorWrap = new EventLoopProgressMonitor(monitor); IProxyRepositoryFactory factory = DesignerPlugin.getDefault().getProxyRepositoryFactory(); List<IRepositoryViewObject> repositoryObjects = getAllRepositoryMetadata(); int total = repositoryObjects.size(); // + elem.getElementParameters().size(); monitorWrap.beginTask(Messages.getString("MultipleThreadDynamicComposite.gatherInformation"), total); //$NON-NLS-1$ IElementParameter propertyParam = elem.getElementParameterFromField(EParameterFieldType.PROPERTY_TYPE, section); String repositoryValue = null; if (propertyParam != null) { repositoryValue = propertyParam.getRepositoryValue(); } if (repositoryObjects != null && (repositoryObjects.size() != 0)) { // repositoryTableMap.clear(); // repositoryQueryStoreMap.clear(); tableIdAndDbTypeMap.clear(); tableIdAndDbSchemaMap.clear(); for (IRepositoryViewObject curObject : repositoryObjects) { Item item = curObject.getProperty().getItem(); if (item instanceof ConnectionItem) { ConnectionItem connectionItem = (ConnectionItem) item; Connection connection = connectionItem.getConnection(); if (connection.isReadOnly()) { continue; } /* code for cache repositoryConnectionItemMap.put should be deleted ,bug 16969 */ // if (repositoryValue != null) { // if ((connection instanceof DelimitedFileConnection) // && (repositoryValue.equals(ERepositoryCategoryType.DELIMITED.getName()))) { // repositoryConnectionItemMap.put(connectionItem.getProperty().getId(), connectionItem); // } // if ((connection instanceof PositionalFileConnection) // && (repositoryValue.equals(ERepositoryCategoryType.POSITIONAL.getName()))) { // repositoryConnectionItemMap.put(connectionItem.getProperty().getId(), connectionItem); // } // if ((connection instanceof FileExcelConnection) // && (repositoryValue.equals(ERepositoryCategoryType.EXCEL.getName()))) { // repositoryConnectionItemMap.put(connectionItem.getProperty().getId(), connectionItem); // } // if ((connection instanceof EbcdicConnection) // && (repositoryValue.equals(ERepositoryCategoryType.EBCDIC.getName()))) { // repositoryConnectionItemMap.put(connectionItem.getProperty().getId(), connectionItem); // } // if ((connection instanceof HL7Connection) // && (repositoryValue.equals(ERepositoryCategoryType.HL7.getName()))) { // repositoryConnectionItemMap.put(connectionItem.getProperty().getId(), connectionItem); // } // if ((connection instanceof FTPConnection) // && (repositoryValue.equals(ERepositoryCategoryType.FTP.getName()))) { // repositoryConnectionItemMap.put(connectionItem.getProperty().getId(), connectionItem); // } // if ((connection instanceof BRMSConnection) // && (repositoryValue.equals(ERepositoryCategoryType.BRMS.getName()))) { // repositoryConnectionItemMap.put(connectionItem.getProperty().getId(), connectionItem); // } // if ((connection instanceof MDMConnection) // && (repositoryValue.equals(ERepositoryCategoryType.MDM.getName()))) { // repositoryConnectionItemMap.put(connectionItem.getProperty().getId(), connectionItem); // } // if ((connection instanceof RegexpFileConnection) // && (repositoryValue.equals(ERepositoryCategoryType.REGEX.getName()))) { // repositoryConnectionItemMap.put(connectionItem.getProperty().getId(), connectionItem); // } // if ((connection instanceof XmlFileConnection) // && (repositoryValue.equals(ERepositoryCategoryType.XML.getName()))) { // repositoryConnectionItemMap.put(connectionItem.getProperty().getId(), connectionItem); // } // if ((connection instanceof GenericSchemaConnection) // && (repositoryValue.equals(ERepositoryCategoryType.GENERIC.getName()))) { // repositoryConnectionItemMap.put(connectionItem.getProperty().getId(), connectionItem); // } // if ((connection instanceof LDAPSchemaConnection) // && (repositoryValue.equals(ERepositoryCategoryType.LDAP.getName()))) { // repositoryConnectionItemMap.put(connectionItem.getProperty().getId(), connectionItem); // } // if ((connection instanceof WSDLSchemaConnection) // && (repositoryValue.equals(ERepositoryCategoryType.WSDL.getName()))) { // repositoryConnectionItemMap.put(connectionItem.getProperty().getId(), connectionItem); // } // if ((connection instanceof SalesforceSchemaConnection) // && (repositoryValue.equals(ERepositoryCategoryType.SALESFORCE.getName()))) { // repositoryConnectionItemMap.put(connectionItem.getProperty().getId(), connectionItem); // } // if ((connection instanceof SAPConnection) // && (repositoryValue.equals(ERepositoryCategoryType.SAP.getName()))) { // repositoryConnectionItemMap.put(connectionItem.getProperty().getId(), connectionItem); // } // if ((connection instanceof HeaderFooterConnection) // && (repositoryValue.equals(ERepositoryCategoryType.HEADERFOOTER.getName()))) { // repositoryConnectionItemMap.put(connectionItem.getProperty().getId(), connectionItem); // } // if ((connection instanceof DatabaseConnection) // && (repositoryValue.startsWith(ERepositoryCategoryType.DATABASE.getName()))) { // String currentDbType = (String) RepositoryToComponentProperty.getValue(connection, // "TYPE", null); //$NON-NLS-1$ // if (repositoryValue.contains(":")) { // database is specified //$NON-NLS-1$ // String neededDbType = repositoryValue.substring(repositoryValue.indexOf(":") + 1); //$NON-NLS-1$; // if (MetadataTalendType.sameDBProductType(neededDbType, currentDbType)) { // repositoryConnectionItemMap.put(connectionItem.getProperty().getId(), connectionItem); // } // } else { // repositoryConnectionItemMap.put(connectionItem.getProperty().getId(), connectionItem); // } // } // } else { // repositoryConnectionItemMap.put(connectionItem.getProperty().getId(), connectionItem); // } for (Object tableObj : ConnectionHelper.getTables(connection)) { org.talend.core.model.metadata.builder.connection.MetadataTable table; table = (org.talend.core.model.metadata.builder.connection.MetadataTable) tableObj; if (factory.getStatus(connectionItem) != ERepositoryStatus.DELETED) { if (!factory.isDeleted(table)) { IMetadataTable newTable = ConvertionHelper.convert(table); // repositoryTableMap.put(connectionItem.getProperty().getId() + " - " + table.getLabel(), //$NON-NLS-1$ // newTable); if (connection instanceof DatabaseConnection) { String dbType = ((DatabaseConnection) connection).getDatabaseType(); String schema = ((DatabaseConnection) connection).getUiSchema(); tableIdAndDbTypeMap.put(newTable.getId(), dbType); if (schema != null && !schema.equals("")) { //$NON-NLS-1$ tableIdAndDbSchemaMap.put(newTable.getId(), schema); } } } } } /* query cache should be deleted ,bug 16969 */ // if (connection instanceof DatabaseConnection) { // DatabaseConnection dbConnection = (DatabaseConnection) connection; // QueriesConnection queriesConnection = dbConnection.getQueries(); // if (queriesConnection != null) { // List<Query> qs = queriesConnection.getQuery(); // for (Query query : qs) { // repositoryQueryStoreMap.put(connectionItem.getProperty().getId() + " - " //$NON-NLS-1$ // + query.getLabel(), query); // } // } // } monitorWrap.worked(1); } // hywang add for feature 6484 if (item instanceof FileItem) { FileItem FileItem = (FileItem) item; if (repositoryValue != null) { if (repositoryValue.equals("RULE")) { //$NON-NLS-1$ repositoryFileItemMap.put(FileItem.getProperty().getId(), FileItem); } } monitorWrap.worked(1); } if (item instanceof LinkRulesItem) { LinkRulesItem linkItem = (LinkRulesItem) item; if (repositoryValue != null) { if (repositoryValue.equals("RULE")) { //$NON-NLS-1$ repositoryLinkRulesItemMap.put(linkItem.getProperty().getId(), linkItem); } } monitorWrap.worked(1); } } } monitorWrap.done(); } }; try { progressDialog.executeProcess(); } catch (InvocationTargetException e) { ExceptionHandler.process(e); return; } catch (Exception e) { ExceptionHandler.process(e); return; } } /** * ftang Comment method "getElement". * * @return an instance of Element */ public Element getElement() { return elem; } /** * */ private boolean checkErrorsWhenViewRefreshed; public void addComponents(boolean forceRedraw) { addComponents(forceRedraw, true, 0); } /** * yzhang Comment method "addcomponents". * * @param forceRedraw * @param reInitialize */ public void addComponents(boolean forceRedraw, boolean reInitialize) { addComponents(forceRedraw, reInitialize, 0); } protected void disposeChildren() { if (composite != null && !composite.isDisposed()) { // Empty the composite before use (kinda refresh) : Control[] ct = composite.getChildren(); for (int i = 0; i < ct.length; i++) { if (ct[i] != null) { if (ct[i].getForeground() != null && !ct[i].getForeground().isDisposed()) { ct[i].getForeground().dispose(); } if (ct[i].getBackground() != null && !ct[i].getBackground().isDisposed()) { ct[i].getBackground().dispose(); } } ct[i].dispose(); } } } private static final int DEFAULT_GROUP_HEIGHT = 20; /** * Initialize all components for the defined section for this node. */ public synchronized void addComponents(boolean forceRedraw, boolean reInitialize, int height) { // achen modifed to fix feature 0005991 if composite.isDisposed return if (elem == null || composite.isDisposed()) { return; } checkErrorsWhenViewRefreshed = true; int heightSize = 0, maxRowSize = 0, nbInRow, numInRow; int maxRow; boolean isCompute = false; if (!forceRedraw) { boolean needRedraw = isNeedRedraw(); if (!needRedraw) { // System.out.println("no need redraw"); return; } } Control lastControl = null; if (reInitialize) { if (currentComponent != null) { disposeChildren(); } } else { heightSize = height; } hashCurControls = new DualHashBidiMap(); maxRow = 0; List<? extends IElementParameter> listParam = elem.getElementParametersWithChildrens(); Map<String, Integer> groupPosition = new HashMap<String, Integer>(); for (int i = 0; i < listParam.size(); i++) { if (listParam.get(i).getCategory() == section) { if (listParam.get(i).getNumRow() > maxRow && listParam.get(i).isShow(listParam)) { maxRow = listParam.get(i).getNumRow(); } } } IElementParameter synchronizeSchemaParam = elem.getElementParameter(EParameterName.NOT_SYNCHRONIZED_SCHEMA.getName()); if (synchronizeSchemaParam != null) { // if the node don't contains a schema type and accept an input flow and is not synchronized // display a schema on the first line just the type to synchronize the schema synchronizeSchemaParam.setShow(!((Node) elem).isSchemaSynchronized()); IElementParameter schemaTypeParam = synchronizeSchemaParam.getChildParameters().get( EParameterName.SCHEMA_TYPE.getName()); if (schemaTypeParam != null) { schemaTypeParam.setReadOnly(((Node) elem).isSchemaSynchronized()); } } generator.initController(this); // System.out.println("********************** NEW ADDCOMPONENTS // **********************"); // TabbedPropertyComposite tabbedPropertyComposite = this.getTabbedPropertyComposite(); int additionalHeightSize = 0; boolean hasDynamicRow = false; for (int i = 0; i < listParam.size(); i++) { IElementParameter curParam = listParam.get(i); if (curParam.getCategory() == section) { if (curParam.getFieldType() != EParameterFieldType.TECHNICAL) { if (curParam.isShow(listParam)) { AbstractElementPropertySectionController controller = generator.getController(curParam.getFieldType(), this); if (controller == null) { continue; } if (controller.hasDynamicRowSize()) { hasDynamicRow = true; break; } } } } } if (hasDynamicRow) { additionalHeightSize = estimatePropertyHeightSize(maxRow, listParam); } //long lastTime = TimeMeasure.timeSinceBegin("DC:refresh:" + getCurrentComponent()); //$NON-NLS-1$ for (int curRow = 1; curRow <= maxRow; curRow++) { maxRowSize = 0; nbInRow = 0; for (int i = 0; i < listParam.size(); i++) { IElementParameter curParam = listParam.get(i); if (curParam.getCategory() == section) { if (curParam.getNumRow() == curRow && curParam.isShow(listParam) && (curParam.getFieldType() != EParameterFieldType.TECHNICAL)) { nbInRow++; } } } numInRow = 0; lastControl = null; curRowSize = 0; for (int i = 0; i < listParam.size(); i++) { IElementParameter curParam = listParam.get(i); if (curParam.getCategory() == section) { if (curParam.getNumRow() == curRow && (curParam.getFieldType() != EParameterFieldType.TECHNICAL)) { // System.out.println("test:" + curParam.getName() + " // field:"+curParam.getField()); if (curParam.isShow(listParam)) { // System.out.println("show:" + curParam.getName() + " field:" + curParam.getField()); numInRow++; AbstractElementPropertySectionController controller = generator.getController( curParam.getFieldType(), this); if (controller == null) { continue; } if (controller.hasDynamicRowSize()) { controller.setAdditionalHeightSize(additionalHeightSize); } String groupName = curParam.getGroup(); Composite subComposite = null; if (groupName != null) { if (!hashCurControls.containsKey(groupName)) { if (groupPosition.size() > 0) { heightSize += DEFAULT_GROUP_HEIGHT; } new GroupController(this).createControl(composite, curParam, numInRow, nbInRow, heightSize, lastControl); groupPosition.put(groupName, heightSize); } subComposite = (Composite) hashCurControls.get(groupName); int h2 = heightSize - groupPosition.get(groupName); lastControl = controller .createControl(subComposite, curParam, numInRow, nbInRow, h2, lastControl); } else { if (isCompactView()) { int h3 = DEFAULT_GROUP_HEIGHT * (groupPosition.size() > 0 ? 1 : 0) + heightSize; lastControl = controller.createControl(composite, curParam, numInRow, nbInRow, h3, lastControl); } else { if (numInRow > 1 && nbInRow > 1) { heightSize += maxRowSize; } int h3 = DEFAULT_GROUP_HEIGHT * (groupPosition.size() > 0 ? 1 : 0) + heightSize; lastControl = controller.createControl(composite, curParam, 1, 1, h3, null); } } // lastTime = TimeMeasure.timeSinceBegin("DC:refresh:" + getCurrentComponent()) - lastTime; //$NON-NLS-1$ // if (DynamicTabbedPropertySection.DEBUG_TIME) { // System.out.println("DC;create:" + curParam.getField().getName() + ";" + getCurrentComponent() //$NON-NLS-1$ //$NON-NLS-2$ // + ";" + lastTime); //$NON-NLS-1$ // } // System.out.println("param:" + curParam.getName() // + " - curRowSize:" + curRowSize); maxRowSize = 0; if (curRowSize > maxRowSize) { maxRowSize = curRowSize; isCompute = true; } } } } } if (isCompute) { heightSize += maxRowSize; isCompute = false; } } if (synchronizeSchemaParam != null) { synchronizeSchemaParam.setShow(false); } resizeScrolledComposite(); } // /** // * DOC Administrator Comment method "updateMainParameters". // */ // protected void updateMainParameters() { // oldQueryStoreType = (String) elem.getPropertyValue(EParameterName.QUERYSTORE_TYPE.getName()); // if (oldQueryStoreType != null) { // if (oldQueryStoreType.equals(EmfComponent.REPOSITORY)) { // showQueryStoreRepositoryList(true); // updateRepositoryList(); // } else { // showQueryStoreRepositoryList(false); // } // } // // IElementParameter param = elem.getElementParameter(EParameterName.PROPERTY_TYPE.getName()); // if (param != null) { // oldPropertyType = (String) param.getValue(); // if (param.isShow(elem.getElementParameters())) { // if (oldPropertyType.equals(EmfComponent.REPOSITORY)) { // showPropertyRepositoryList(true, false); // updateRepositoryList(); // } else { // showPropertyRepositoryList(false, false); // } // } else { // showPropertyRepositoryList(false, false); // } // } // // for job settings extra (feature 2710) // param = elem.getElementParameter(extraPropertyTypeName); // if (param != null) { // oldPropertyType = (String) param.getValue(); // if (param.isShow(elem.getElementParameters())) { // if (oldPropertyType.equals(EmfComponent.REPOSITORY)) { // showPropertyRepositoryList(true, true); // updateRepositoryList(); // } else { // showPropertyRepositoryList(false, true); // } // } else { // showPropertyRepositoryList(false, true); // } // } // oldProcessType = (String) elem.getPropertyValue(EParameterName.PROCESS_TYPE_PROCESS.getName()); // if (oldProcessType != null) { // String[] list = // elem.getElementParameter(EParameterName.PROCESS_TYPE_PROCESS.getName()).getListItemsDisplayName(); // if ((oldProcessType.equals("NO_PROCESS") || (list.length == 0))) { //$NON-NLS-1$ // updateProcessList(); // updateContextList(); // if (elem instanceof Node) { // ((Node) elem).checkAndRefreshNode(); // } // } // } // } /** * DOC Administrator Comment method "isNeedRedraw". * * @return */ protected boolean isNeedRedraw() { boolean needRedraw = false; for (IElementParameter elementParameter : elem.getElementParametersWithChildrens()) { if (elementParameter.getCategory().equals(section) && (elementParameter.getFieldType() != EParameterFieldType.SCHEMA_TYPE) && (elementParameter.getFieldType() != EParameterFieldType.QUERYSTORE_TYPE)) { // if the component must be displayed, then check if the // control exists or not. boolean show = elementParameter.isShow(elem.getElementParameters()); Object control; if (elementParameter.getParentParameter() == null) { control = hashCurControls.get(elementParameter.getName()); } else { control = hashCurControls.get(elementParameter.getParentParameter().getName() + ":" //$NON-NLS-1$ + elementParameter.getName()); } if ((control == null && show) || (control != null && !show)) { needRedraw = true; break; } } } return needRedraw; } /** * DOC nrousseau Comment method "estimatePropertyHeightSize". * * @param maxRow * @param listParam * @param tabbedPropertyComposite */ private int estimatePropertyHeightSize(int maxRow, List<? extends IElementParameter> listParam) { int estimatedHeightSize = 0, estimatedMaxRowSize = 0; int additionalHeightSize = 0; int compositeHeight = getParent().getBounds().height; // System.out.println("size composite:" + compositeHeight); int nbDynamic = 0; for (int curRow = 1; curRow <= maxRow; curRow++) { estimatedMaxRowSize = 0; for (int i = 0; i < listParam.size(); i++) { IElementParameter curParam = listParam.get(i); if (curParam.getCategory() == section) { if (curParam.getNumRow() == curRow && (curParam.getFieldType() != EParameterFieldType.TECHNICAL)) { // System.out.println("test:" + curParam.getName() + " // field:"+curParam.getField()); if (curParam.isShow(listParam)) { // System.out.println("show:" + curParam.getName()+ // " field:"+curParam.getField()); AbstractElementPropertySectionController controller = generator.getController( curParam.getFieldType(), this); if (controller == null) { break; } int estimatedSize = controller.estimateRowSize(composite, curParam); if (controller.hasDynamicRowSize()) { nbDynamic++; } // System.out.println("param:" + curParam.getName() // + " - estimatedSize:" + estimatedSize); if (estimatedSize > estimatedMaxRowSize) { estimatedMaxRowSize = estimatedSize; } } } } } estimatedHeightSize += estimatedMaxRowSize; } // System.out.println("*** ESTIMATED SIZE:" + estimatedHeightSize + " // ***"); int emptySpace = compositeHeight - estimatedHeightSize; // System.out.println("--- EMPTY SPACE:" + emptySpace); if (emptySpace > 0 && nbDynamic > 0) { additionalHeightSize = emptySpace / nbDynamic; // System.out.println("--- DIVIDED ADDITIONAL HEIGHT (for each // dynamic):" + additionalHeightSize); } return additionalHeightSize; } private void resizeScrolledComposite() { // Point compositeSize = composite.computeSize(SWT.DEFAULT, SWT.DEFAULT); // // Point parentSize = getParent().getSize(); // // System.out.println("compositeSize:" + compositeSize + " / parentSize:" + parentSize); lastCompositeSize = getParent().getClientArea().height; // setMinSize(compositeSize); propertyResized = true; } public void refresh() { Thread thread = new Thread() { @Override public void run() { try { operationInThread(); } catch (Exception e) { // e.printStackTrace(); ExceptionHandler.process(e); } } }; thread.start(); } private void operationInThread() { // TimeMeasure.display = false; // TimeMeasure.measureActive = true; // TimeMeasure.begin("DC:refresh:" + getCurrentComponent()); //$NON-NLS-1$ if (elem == null) { return; } List<? extends IElementParameter> listParam = elem.getElementParametersWithChildrens(); // hywang modified for // 6484 // IElementParameter jobParam = elem.getElementParameterFromField(EParameterFieldType.PROCESS_TYPE); // if (jobParam != null) { // updateContextList(jobParam); // if (elem instanceof Node) { // ((Node) elem).checkAndRefreshNode(); // } // } Boolean updateNeeded = (Boolean) elem.getPropertyValue(updataComponentParamName); if (updateNeeded != null) { if (updateNeeded) { Display.getDefault().syncExec(new Runnable() { public void run() { if (elem != null) { addComponents(forceRedraw); elem.setPropertyValue(updataComponentParamName, new Boolean(false)); forceRedraw = false; } } }); } } final ECodeLanguage language = ((RepositoryContext) org.talend.core.CorePlugin.getContext().getProperty( org.talend.core.context.Context.REPOSITORY_CONTEXT_KEY)).getProject().getLanguage(); IRunProcessService service = DesignerPlugin.getDefault().getRunProcessService(); final ICodeProblemsChecker syntaxChecker = service.getSyntaxChecker(language); List<Problem> javaProblem = null; for (int i = 0; i < listParam.size(); i++) { if (listParam.get(i).getCategory() == section) { if (listParam.get(i).isShow(listParam)) { final IElementParameter e = listParam.get(i); e.isReadOnly(); e.isNoCheck(); if (language == ECodeLanguage.JAVA && javaProblem == null) { if (!e.isReadOnly() && !e.isNoCheck()) { javaProblem = syntaxChecker.checkProblems(null); } } final List<Problem> nodePros = javaProblem; Display.getDefault().syncExec(new Runnable() { public void run() { if (generator != null) { AbstractElementPropertySectionController controller = generator.getController(e.getFieldType(), MultipleThreadDynamicComposite.this); if (controller != null) { controller.updateCodeProblems(nodePros); controller.refresh(e, checkErrorsWhenViewRefreshed); } } } }); } } } if (propertyResized) { Display.getDefault().syncExec(new Runnable() { public void run() { try { removeListener(SWT.Resize, resizeListener); getParent().layout(); composite.pack(); propertyResized = false; addListener(SWT.Resize, resizeListener); } catch (Exception e) { } } }); } checkErrorsWhenViewRefreshed = false; // long time = TimeMeasure.timeSinceBegin("DC:refresh:" + getCurrentComponent()); //$NON-NLS-1$ // TimeMeasure.end("DC:refresh:" + getCurrentComponent()); //$NON-NLS-1$ // if (DynamicTabbedPropertySection.DEBUG_TIME) { // System.out.println("DC;total;" + getCurrentComponent() + ";" + time); //$NON-NLS-1$ //$NON-NLS-2$ // } isRefreshing = false; } public static boolean isRefreshing = false; private final Listener resizeListener = new Listener() { public void handleEvent(Event event) { resizeLimiter.resetTimer(); resizeLimiter.startIfExecutable(true, null); } }; private final ExecutionLimiter resizeLimiter = new ExecutionLimiter(250, true) { @Override public void execute(final boolean isFinalExecution, Object data) { if (!isDisposed()) { getDisplay().asyncExec(new Runnable() { public void run() { if (!isDisposed() && !getParent().isDisposed()) { int currentSize = getParent().getClientArea().height; if (getLastCompositeSize() != currentSize) { addComponents(true); refresh(); } } } }); } } }; /** * Getter for isCompactView. * * @return the isCompactView */ public boolean isCompactView() { return this.isCompactView; } /** * Sets the isCompactView. * * @param isCompactView the isCompactView to set */ public void setCompactView(boolean isCompactView) { this.isCompactView = isCompactView; } /** * Set the section of the tabbed property. * * @param section */ public MultipleThreadDynamicComposite(Composite parentComposite, int styles, final EComponentCategory section, Element element, boolean isCompactView) { super(parentComposite, styles); setCompactView(isCompactView); // for job settings extra (feature 2710) // if (section == EComponentCategory.EXTRA) { // updataComponentParamName = // JobSettingsConstants.getExtraParameterName(EParameterName.UPDATE_COMPONENTS.getName()); // } else { updataComponentParamName = EParameterName.UPDATE_COMPONENTS.getName(); // } FormData d = new FormData(); d.left = new FormAttachment(0, 0); d.right = new FormAttachment(100, 0); d.top = new FormAttachment(0, 0); d.bottom = new FormAttachment(100, 0); setLayoutData(d); setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_WHITE)); setExpandHorizontal(true); // setExpandVertical(true); composite = widgetFactory.createComposite(this, SWT.NO_FOCUS); setContent(composite); generator = new DynamicPropertyGenerator(); this.section = section; this.elem = element; if (elem instanceof Node) { process = (Process) ((Node) elem).getProcess(); } else if (elem instanceof SubjobContainer) { process = (Process) ((SubjobContainer) elem).getProcess(); } if (elem instanceof org.talend.designer.core.ui.editor.connections.Connection) { org.talend.designer.core.ui.editor.connections.Connection connection; connection = (org.talend.designer.core.ui.editor.connections.Connection) elem; process = (Process) connection.getSource().getProcess(); } if (elem instanceof Process) { process = (Process) elem; } // added by achen fix 0005991 & 0005993 // if (elem instanceof StatsAndLogsElement || elem instanceof ImplicitContextLoadElement) { // process = ActiveProcessTracker.getCurrentProcess(); // } // end if (process != null) { part = (AbstractMultiPageTalendEditor) process.getEditor(); } FormLayout layout = new FormLayout(); layout.marginWidth = ITabbedPropertyConstants.HSPACE + 2; layout.marginHeight = ITabbedPropertyConstants.VSPACE; layout.spacing = ITabbedPropertyConstants.VMARGIN + 1; composite.setLayout(layout); /* caches deleted by bug16969 */ // repositoryQueryStoreMap = new HashMap<String, Query>(); // repositoryConnectionItemMap = new HashMap<String, ConnectionItem>(); // repositoryTableMap = new HashMap<String, IMetadataTable>(); hashCurControls = new DualHashBidiMap(); if ((currentComponent == null) || (!currentComponent.equals(elem.getElementName()))) { forceRedraw = true; elem.setPropertyValue(updataComponentParamName, Boolean.TRUE); } currentComponent = elem.getElementName(); propertyResized = true; addListener(SWT.Resize, resizeListener); addListener(SWT.FocusOut, new Listener() { public void handleEvent(Event event) { // if the focus is lost reinitialise all information from repository /* bug 16969 */ // repositoryTableMap.clear(); // repositoryQueryStoreMap.clear(); // repositoryConnectionItemMap.clear(); } }); if (getCommandStack() != null) { getCommandStack().addCommandStackEventListener(commandStackEventListener); } // for job settings extra (feature 2710) // extraPropertyTypeName = JobSettingsConstants.getExtraParameterName(EParameterName.PROPERTY_TYPE.getName()); // extraRepositoryPropertyTypeName = // JobSettingsConstants.getExtraParameterName(EParameterName.REPOSITORY_PROPERTY_TYPE // .getName()); } /* * (non-Javadoc) * * @see org.eclipse.swt.widgets.Widget#dispose() */ @Override public void dispose() { CommandStack cmdStack = getCommandStack(); if (cmdStack != null) { cmdStack.removeCommandStackEventListener(commandStackEventListener); } disposeChildren(); if (widgetFactory != null) widgetFactory.dispose(); super.dispose(); process = null; elem = null; part = null; generator.dispose(); generator = null; hashCurControls.clear(); } CommandStackEventListener commandStackEventListener = new CommandStackEventListener() { public void stackChanged(CommandStackEvent event) { int detail = event.getDetail(); if ((getElement() instanceof org.talend.designer.core.ui.editor.connections.Connection) && (event.getCommand() instanceof ChangeMetadataCommand) && (0 != (detail & CommandStack.POST_EXECUTE) || 0 != (detail & CommandStack.POST_REDO) // || 0 != (detail & CommandStack.POST_REDO))) { addComponents(true); refresh(); } if (0 != (detail & CommandStack.POST_EXECUTE) || 0 != (detail & CommandStack.POST_UNDO) || 0 != (detail & CommandStack.POST_REDO)) { Boolean updateNeeded = (Boolean) elem.getPropertyValue(updataComponentParamName); if (updateNeeded) { refresh(); } } } }; /** * yzhang Comment method "setCurRowSize" Sets the curRowSize. * * @param curRowSize int */ public void setCurRowSize(int curRowSize) { this.curRowSize = curRowSize; } /** * Getter for currentComponent. * * @return the currentComponent */ public String getCurrentComponent() { return this.currentComponent; } /** * Getter for curRowSize. * * @return the curRowSize */ public int getCurRowSize() { return this.curRowSize; } /** * Getter for hashCurControls. * * @return the hashCurControls */ public BidiMap getHashCurControls() { return this.hashCurControls; } /** * Getter for part. * * @return the part */ public AbstractMultiPageTalendEditor getPart() { return this.part; } /** * Getter for section. * * @return the section */ public EComponentCategory getSection() { return this.section; } /** * Get the command stack of the Gef editor. * * @return */ public CommandStack getCommandStack() { if (part != null && part.getTalendEditor() != null) { Object adapter = part.getTalendEditor().getAdapter(CommandStack.class); return (CommandStack) adapter; } else { return null; } } /** * qzhang Comment method "getDefaultRepository". * * @return */ private String getDefaultRepository(IElementParameter baseParam, boolean istable, String defaultPropertyValue) { boolean metadataInput = false; if (((Node) elem).getCurrentActiveLinksNbInput(EConnectionType.FLOW_MAIN) > 0 || ((Node) elem).getCurrentActiveLinksNbInput(EConnectionType.FLOW_REF) > 0 || ((Node) elem).getCurrentActiveLinksNbInput(EConnectionType.TABLE) > 0) { metadataInput = true; } if (metadataInput && istable) { return (String) baseParam.getChildParameters().get(EParameterName.REPOSITORY_SCHEMA_TYPE.getName()).getValue(); } Object propertyValue = elem.getPropertyValue(EParameterName.REPOSITORY_PROPERTY_TYPE.getName()); if ((propertyValue == null || !(propertyValue instanceof String)) && defaultPropertyValue != null) { propertyValue = defaultPropertyValue; } if (propertyValue == null || propertyValue.equals("")) { //$NON-NLS-1$ return ""; //$NON-NLS-1$ } if (istable) { // } else { // } return ""; //$NON-NLS-1$ } /** * Getter for tableIdAndDbTypeMap. * * @return the tableIdAndDbTypeMap */ public Map<String, String> getTableIdAndDbTypeMap() { if (this.tableIdAndDbTypeMap.isEmpty()) { updateRepositoryList(); } return this.tableIdAndDbTypeMap; } /** * Getter for tableIdAndDbSchemaMap. * * @return the tableIdAndDbSchemaMap */ public Map<String, String> getTableIdAndDbSchemaMap() { if (this.tableIdAndDbSchemaMap.isEmpty()) { updateRepositoryList(); } return this.tableIdAndDbSchemaMap; } /* query cache should be deleted ,bug 16969 */ // /** // * Getter for repositoryQueryStoreMap. // * // * @return the repositoryQueryStoreMap // */ // public Map<String, Query> getRepositoryQueryStoreMap() { // if (this.repositoryQueryStoreMap.isEmpty()) { // updateRepositoryList(); // } // return repositoryQueryStoreMap; // } // /** // * dev Comment method "getRepositoryTableMap". // * // * @return Map // */ // public Map<String, IMetadataTable> getRepositoryTableMap() { // if (this.repositoryTableMap.isEmpty()) { // updateRepositoryList(); // } // return this.repositoryTableMap; // } /* 16969 */ // /** // * dev Comment method "getRepositoryConnectionItemMap". // * // * @return Map // */ // public Map<String, ConnectionItem> getRepositoryConnectionItemMap() { // if (this.repositoryConnectionItemMap.isEmpty()) { // updateRepositoryList(); // } // return this.repositoryConnectionItemMap; // } /** * hywang Comment method "getRepositoryFileItemMap". * * @see org.talend.core.properties.tab.IDynamicProperty#getRepositoryFileItemMap() */ public Map<String, FileItem> getRepositoryFileItemMap() { if (this.repositoryFileItemMap.isEmpty()) { updateRepositoryList(); } return this.repositoryFileItemMap; } public Map<String, LinkRulesItem> getRepositoryLinkRulesItemMap() { return this.repositoryLinkRulesItemMap; } public void setRepositoryFileItemMap(Map<String, FileItem> repositoryFileItemMap) { this.repositoryFileItemMap = repositoryFileItemMap; } /** * Getter for lastCompositeSize. * * @return the lastCompositeSize */ public int getLastCompositeSize() { return this.lastCompositeSize; } /* * (non-Javadoc) * * @see org.talend.designer.core.ui.editor.properties.controllers.generator.IDynamicProperty#getComposite() */ public Composite getComposite() { return composite; } }