// ============================================================================ // // 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.repository.ui.dialog; import java.util.Iterator; import java.util.List; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.jface.dialogs.IDialogConstants; import org.eclipse.jface.preference.IPreferenceNode; import org.eclipse.jface.preference.IPreferencePage; import org.eclipse.jface.preference.PreferenceDialog; import org.eclipse.jface.preference.PreferenceManager; import org.eclipse.jface.resource.JFaceResources; import org.eclipse.jface.util.Policy; import org.eclipse.jface.util.SafeRunnable; import org.eclipse.swt.SWT; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.FileDialog; import org.eclipse.swt.widgets.MessageBox; import org.eclipse.swt.widgets.Shell; import org.talend.commons.exception.PersistenceException; import org.talend.commons.ui.runtime.exception.ExceptionHandler; import org.talend.core.CorePlugin; import org.talend.core.PluginChecker; import org.talend.core.model.general.Project; import org.talend.core.model.properties.FolderItem; import org.talend.core.model.properties.Item; import org.talend.core.repository.model.ProxyRepositoryFactory; import org.talend.repository.ProjectManager; import org.talend.repository.RepositoryWorkUnit; import org.talend.repository.i18n.Messages; import org.talend.repository.model.IProxyRepositoryFactory; import org.talend.repository.ui.actions.ExportProjectSettings; import org.talend.repository.ui.actions.ImportProjectSettings; /** * wchen class global comment. Detailled comment */ public class ProjectSettingsPreferenceDialog extends PreferenceDialog { private Button importButton; private Button exportButton; public static final int IMPORT = 97; public static final int EXPORT = 98; /** * wchen ProjectSettingsPreferenceDialog constructor comment. * * @param parentShell * @param manager */ public ProjectSettingsPreferenceDialog(Shell parentShell, PreferenceManager manager) { super(parentShell, manager); unloadProject(); } @Override protected void createButtonsForButtonBar(Composite parent) { IProxyRepositoryFactory factory = ProxyRepositoryFactory.getInstance(); if (!factory.isUserReadOnlyOnCurrentProject()) { importButton = createButton(parent, IMPORT, "Import", false); //$NON-NLS-1$ exportButton = createButton(parent, EXPORT, "Export", false); //$NON-NLS-1$ } super.createButtonsForButtonBar(parent); } @Override protected void buttonPressed(int buttonId) { switch (buttonId) { case IDialogConstants.OK_ID: { okPressed(); commiteProjectSettings(); return; } case IDialogConstants.CANCEL_ID: { cancelPressed(); return; } case IDialogConstants.HELP_ID: { helpPressed(); return; } case IMPORT: { importPressed(); commiteProjectSettings(); return; } case EXPORT: { exportPressed(); return; } } } private void commiteProjectSettings() { // excute a workUnit to do svn commite RepositoryWorkUnit repositoryWorkUnit = new RepositoryWorkUnit(ProjectManager.getInstance().getCurrentProject(), "") { public void run() throws PersistenceException { // do nothing } }; repositoryWorkUnit.setAvoidUnloadResources(true); CorePlugin.getDefault().getRepositoryService().getProxyRepositoryFactory().executeRepositoryWorkUnit(repositoryWorkUnit); } private void importPressed() { FileDialog fileDialog = new FileDialog(getShell(), SWT.OPEN); String[] files = new String[] { "*.xml" }; //$NON-NLS-1$ fileDialog.setFilterExtensions(files); String path = fileDialog.open(); ImportProjectSettings settings = new ImportProjectSettings(path); boolean error = false; try { settings.updateProjectSettings(); } catch (Exception e) { error = true; showErrorMessage(); } // close the projec settings and open it again to get new settings if (!error) { close(); ProjectSettingDialog dialog = new ProjectSettingDialog(); dialog.open(); } } private void exportPressed() { saveCurrentSettings(); FileDialog fileDialog = new FileDialog(getShell(), SWT.SAVE); fileDialog.setFileName("ProjectSettings.xml"); //$NON-NLS-1$ String[] files = new String[] { "*.xml" }; //$NON-NLS-1$ fileDialog.setFilterExtensions(files); String path = fileDialog.open(); ExportProjectSettings settings = new ExportProjectSettings(path); settings.saveProjectSettings(); } private void showErrorMessage() { MessageBox message = new MessageBox(new Shell(getShell()), SWT.ICON_ERROR | SWT.OK); message.setMessage(Messages.getString("ImportProjectSettings.Error")); //$NON-NLS-1$ message.open(); } protected void saveCurrentSettings() { SafeRunnable.run(new SafeRunnable() { private boolean errorOccurred; public void run() { errorOccurred = false; boolean hasFailedOK = false; try { Iterator nodes = getPreferenceManager().getElements(PreferenceManager.PRE_ORDER).iterator(); while (nodes.hasNext()) { IPreferenceNode node = (IPreferenceNode) nodes.next(); IPreferencePage page = node.getPage(); if (page != null) { if (!page.performOk()) { hasFailedOK = true; return; } } } } catch (Exception e) { handleException(e); } finally { if (hasFailedOK) { setReturnCode(FAILED); return; } if (!errorOccurred) { handleSave(); } setReturnCode(OK); } } public void handleException(Throwable e) { errorOccurred = true; Policy.getLog().log(new Status(IStatus.ERROR, Policy.JFACE, 0, e.toString(), e)); clearSelectedNode(); String message = JFaceResources.getString("SafeRunnable.errorMessage"); //$NON-NLS-1$ Policy.getStatusHandler().show(new Status(IStatus.ERROR, Policy.JFACE, message, e), JFaceResources.getString("Error")); //$NON-NLS-1$ } }); } void clearSelectedNode() { setSelectedNodePreference(null); } private void unloadProject() { Project currentProject = ProjectManager.getInstance().getCurrentProject(); final ProxyRepositoryFactory instance = ProxyRepositoryFactory.getInstance(); if (PluginChecker.isSVNProviderPluginLoaded()) { try { if (!instance.isLocalConnectionProvider()) { // instance.getRepositoryFactoryFromProvider().reloadProject(currentProject); } } catch (PersistenceException e) { ExceptionHandler.process(e); } } } private void fillParentsFolderInfos(FolderItem folderItem) { for (Item curItem : (List<Item>) folderItem.getChildren()) { if (curItem instanceof FolderItem) { fillParentsFolderInfos((FolderItem) curItem); } curItem.setParent(folderItem); } } }