/* * DBeaver - Universal Database Manager * Copyright (C) 2010-2017 Serge Rider (serge@jkiss.org) * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.jkiss.dbeaver.tools.scripts; import org.eclipse.core.resources.IContainer; import org.eclipse.core.resources.IFolder; import org.eclipse.core.resources.IResource; import org.eclipse.jface.dialogs.IMessageProvider; import org.eclipse.jface.viewers.*; import org.eclipse.jface.wizard.WizardPage; import org.eclipse.swt.SWT; import org.eclipse.swt.events.ModifyEvent; import org.eclipse.swt.events.ModifyListener; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.DirectoryDialog; import org.eclipse.swt.widgets.Text; import org.jkiss.dbeaver.core.CoreMessages; import org.jkiss.dbeaver.core.DBeaverCore; import org.jkiss.dbeaver.Log; import org.jkiss.dbeaver.model.DBIcon; import org.jkiss.dbeaver.model.navigator.DBNResource; import org.jkiss.dbeaver.utils.RuntimeUtils; import org.jkiss.dbeaver.ui.DBeaverIcons; import org.jkiss.dbeaver.ui.UIUtils; import org.jkiss.dbeaver.ui.navigator.database.DatabaseNavigatorTree; import org.jkiss.utils.CommonUtils; import java.io.File; import java.util.ArrayList; import java.util.LinkedHashSet; import java.util.List; import java.util.Set; class ScriptsExportWizardPage extends WizardPage { private static final Log log = Log.getLog(ScriptsExportWizardPage.class); static final String PREF_SCRIPTS_EXPORT_OUT_DIR = "export.scripts.out.dir"; //$NON-NLS-1$ private Button overwriteCheck; private Text directoryText; private DatabaseNavigatorTree scriptsNavigator; private final List<DBNResource> selectedResources = new ArrayList<>(); protected ScriptsExportWizardPage(String pageName) { super(pageName); setTitle(CoreMessages.dialog_project_export_wizard_page_title); } @Override public boolean isPageComplete() { if (directoryText == null || directoryText.isDisposed() || scriptsNavigator == null || scriptsNavigator.isDisposed()) { return false; } if (CommonUtils.isEmpty(directoryText.getText())) { setMessage(CoreMessages.dialog_project_export_wizard_page_message_no_output_dir, IMessageProvider.ERROR); return false; } selectedResources.clear(); CheckboxTreeViewer viewer = (CheckboxTreeViewer) scriptsNavigator.getViewer(); for (Object obj : viewer.getCheckedElements()) { if (obj instanceof DBNResource) { selectedResources.add((DBNResource) obj); } } if (selectedResources.isEmpty()) { setMessage(CoreMessages.dialog_project_export_wizard_page_message_check_script, IMessageProvider.ERROR); return false; } else { setMessage(CoreMessages.dialog_project_export_wizard_page_message_configure_settings, IMessageProvider.NONE); return true; } } @Override public void createControl(Composite parent) { String outDir = DBeaverCore.getGlobalPreferenceStore().getString(PREF_SCRIPTS_EXPORT_OUT_DIR); if (CommonUtils.isEmpty(outDir)) { outDir = RuntimeUtils.getUserHomeDir().getAbsolutePath(); } Composite placeholder = UIUtils.createPlaceholder(parent, 1); placeholder.setLayout(new GridLayout(1, false)); // Project list scriptsNavigator = new DatabaseNavigatorTree(placeholder, DBeaverCore.getInstance().getNavigatorModel().getRoot(), SWT.BORDER | SWT.CHECK); GridData gd = new GridData(GridData.FILL_BOTH); scriptsNavigator.setLayoutData(gd); CheckboxTreeViewer viewer = (CheckboxTreeViewer) scriptsNavigator.getViewer(); viewer.addCheckStateListener(new ICheckStateListener() { @Override public void checkStateChanged(CheckStateChangedEvent event) { updateState(); } }); scriptsNavigator.getViewer().addFilter(new ViewerFilter() { @Override public boolean select(Viewer viewer, Object parentElement, Object element) { return element instanceof DBNResource && ((DBNResource) element).getResource() instanceof IContainer; } }); // Output folder Composite generalSettings = UIUtils.createPlaceholder(placeholder, 3); generalSettings.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); { overwriteCheck = UIUtils.createCheckbox(generalSettings, CoreMessages.dialog_project_export_wizard_page_checkbox_overwrite_files, false); gd = new GridData(GridData.BEGINNING); gd.horizontalSpan = 3; overwriteCheck.setLayoutData(gd); UIUtils.createControlLabel(generalSettings, CoreMessages.dialog_project_export_wizard_page_label_directory); directoryText = new Text(generalSettings, SWT.BORDER); directoryText.setText(outDir); directoryText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); directoryText.addModifyListener(new ModifyListener() { @Override public void modifyText(ModifyEvent e) { updateState(); } }); Button openFolder = new Button(generalSettings, SWT.PUSH); openFolder.setImage(DBeaverIcons.getImage(DBIcon.TREE_FOLDER)); openFolder.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { DirectoryDialog dialog = new DirectoryDialog(getShell(), SWT.NONE); dialog.setMessage(CoreMessages.dialog_project_export_wizard_page_dialog_choose_export_dir_message); dialog.setText(CoreMessages.dialog_project_export_wizard_page_dialog_choose_export_dir_text); String directory = directoryText.getText(); if (!CommonUtils.isEmpty(directory)) { dialog.setFilterPath(directory); } directory = dialog.open(); if (directory != null) { directoryText.setText(directory); } } }); } setControl(placeholder); updateState(); } private void updateState() { getContainer().updateButtons(); } public ScriptsExportData getExportData() { Set<IResource> result = new LinkedHashSet<>(); // Add folders for (DBNResource resourceNode : selectedResources) { final IResource resource = resourceNode.getResource(); if (resource instanceof IFolder) { addResourceToSet(result, resource); } } // Add files for (DBNResource resourceNode : selectedResources) { final IResource resource = resourceNode.getResource(); addResourceToSet(result, resource); } final String outputDir = directoryText.getText(); DBeaverCore.getGlobalPreferenceStore().setValue(PREF_SCRIPTS_EXPORT_OUT_DIR, outputDir); return new ScriptsExportData(result, overwriteCheck.getSelection(), new File(outputDir)); } private void addResourceToSet(Set<IResource> result, IResource resource) { boolean skip = false; for (IResource parent = resource.getParent(); parent != null; parent = parent.getParent()) { if (result.contains(parent)) { skip = true; break; } } if (!skip) { result.add(resource); } } }