/* * 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.project; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IResource; import org.eclipse.jface.dialogs.IMessageProvider; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.IStructuredSelection; 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.*; import org.jkiss.dbeaver.core.CoreMessages; import org.jkiss.dbeaver.core.DBeaverCore; import org.jkiss.dbeaver.core.DBeaverUI; import org.jkiss.dbeaver.model.DBIcon; import org.jkiss.dbeaver.ui.DBeaverIcons; import org.jkiss.dbeaver.ui.UIUtils; import org.jkiss.dbeaver.utils.RuntimeUtils; import org.jkiss.utils.CommonUtils; import java.io.File; import java.util.*; import java.util.List; class ProjectExportWizardPage extends WizardPage { private static final String PREF_PROJECTS_EXPORT_OUT_DIR = "export.projects.out.dir"; //NON-NLS-1 //$NON-NLS-1$ private Text directoryText; private Table projectsTable; private Button exportDriverCheck; private Text fileNameText; private boolean fileNameEdited = false; protected ProjectExportWizardPage(String pageName) { super(pageName); setTitle(CoreMessages.dialog_project_export_wizard_start_title); } @Override public boolean isPageComplete() { if (directoryText == null || directoryText.isDisposed() || projectsTable == null || projectsTable.isDisposed()) { return false; } if (CommonUtils.isEmpty(directoryText.getText())) { setMessage(CoreMessages.dialog_project_export_wizard_start_message_empty_output_directory, IMessageProvider.ERROR); return false; } for (TableItem item : projectsTable.getItems()) { if (item.getChecked()) { setMessage(CoreMessages.dialog_project_export_wizard_start_message_configure_settings, IMessageProvider.NONE); return true; } } setMessage(CoreMessages.dialog_project_export_wizard_start_message_choose_project, IMessageProvider.ERROR); return false; } @Override public void createControl(Composite parent) { String outDir = DBeaverCore.getGlobalPreferenceStore().getString(PREF_PROJECTS_EXPORT_OUT_DIR); if (CommonUtils.isEmpty(outDir)) { outDir = RuntimeUtils.getUserHomeDir().getAbsolutePath(); } Set<IProject> projectList = new LinkedHashSet<>(); final ISelection selection = DBeaverUI.getActiveWorkbenchWindow().getActivePage().getSelection(); if (selection != null && !selection.isEmpty() && selection instanceof IStructuredSelection) { for (Iterator<?> iter = ((IStructuredSelection) selection).iterator(); iter.hasNext(); ) { Object element = iter.next(); IResource resource = RuntimeUtils.getObjectAdapter(element, IResource.class); if (resource != null) { projectList.add(resource.getProject()); } } } if (projectList.isEmpty()) { IProject activeProject = DBeaverCore.getInstance().getProjectRegistry().getActiveProject(); if (activeProject != null) { projectList.add(activeProject); } } Composite placeholder = UIUtils.createPlaceholder(parent, 1); placeholder.setLayout(new GridLayout(1, false)); // Project list projectsTable = new Table(placeholder, SWT.MULTI | SWT.CHECK | SWT.BORDER); GridData gd = new GridData(GridData.FILL_BOTH); projectsTable.setLayoutData(gd); projectsTable.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { updateState(); } }); for (IProject project : DBeaverCore.getInstance().getLiveProjects()) { final TableItem item = new TableItem(projectsTable, SWT.NONE); item.setImage(DBeaverIcons.getImage(DBIcon.PROJECT)); item.setText(project.getName()); item.setData(project); if (projectList.contains(project)) { item.setChecked(true); } } final Composite fileNameGroup = UIUtils.createPlaceholder(placeholder, 2); fileNameGroup.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); fileNameText = UIUtils.createLabelText(fileNameGroup, CoreMessages.dialog_project_export_wizard_start_label_output_file, null); //$NON-NLS-2$ fileNameText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); fileNameText.addModifyListener(new ModifyListener() { @Override public void modifyText(ModifyEvent e) { if (!CommonUtils.equalObjects(fileNameText.getText(), getArchiveFileName(getProjectsToExport()))) { fileNameEdited = true; } } }); // Output folder Composite generalSettings = UIUtils.createPlaceholder(placeholder, 3); generalSettings.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); { UIUtils.createControlLabel(generalSettings, CoreMessages.dialog_project_export_wizard_start_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_start_dialog_directory_message); dialog.setText(CoreMessages.dialog_project_export_wizard_start_dialog_directory_text); String directory = directoryText.getText(); if (!CommonUtils.isEmpty(directory)) { dialog.setFilterPath(directory); } directory = dialog.open(); if (directory != null) { directoryText.setText(directory); } } }); } exportDriverCheck = UIUtils.createCheckbox(placeholder, CoreMessages.dialog_project_export_wizard_start_checkbox_libraries, false); gd = new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING); gd.horizontalSpan = 3; exportDriverCheck.setLayoutData(gd); setControl(placeholder); updateState(); } private void updateState() { if (!fileNameEdited) { final String archiveFileName = getArchiveFileName(getProjectsToExport()); fileNameText.setText(archiveFileName); } getContainer().updateButtons(); } ProjectExportData getExportData() { final String outputDir = directoryText.getText(); DBeaverCore.getGlobalPreferenceStore().setValue(PREF_PROJECTS_EXPORT_OUT_DIR, outputDir); return new ProjectExportData( getProjectsToExport(), new File(outputDir), exportDriverCheck.getSelection(), fileNameText.getText()); } private List<IProject> getProjectsToExport() { List<IProject> result = new ArrayList<>(); for (TableItem item : projectsTable.getItems()) { if (item.getChecked()) { result.add((IProject) item.getData()); } } return result; } static String getArchiveFileName(List<IProject> projects) { String archiveName = CoreMessages.dialog_project_export_wizard_start_archive_name_prefix; if (projects.size() == 1) { archiveName = projects.get(0).getName(); } archiveName += "-" + RuntimeUtils.getCurrentDate(); //$NON-NLS-1$ //archiveName += ExportConstants.ARCHIVE_FILE_EXT; return archiveName; } }