/* * 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.jface.dialogs.IMessageProvider; import org.eclipse.jface.wizard.WizardPage; import org.eclipse.osgi.util.NLS; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.TableEditor; import org.eclipse.swt.events.*; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.widgets.*; import org.jkiss.dbeaver.core.CoreMessages; import org.jkiss.dbeaver.core.DBeaverCore; import org.jkiss.dbeaver.model.DBIcon; import org.jkiss.dbeaver.ui.DBeaverIcons; import org.jkiss.dbeaver.ui.UIUtils; import org.jkiss.utils.CommonUtils; import org.jkiss.utils.xml.XMLUtils; import org.w3c.dom.Document; import org.w3c.dom.Element; import java.io.File; class ProjectImportWizardPageFile extends WizardPage { private ProjectImportData importData; private String curFolder; private Table projectsTable; protected ProjectImportWizardPageFile(ProjectImportData importData) { super(CoreMessages.dialog_project_import_wizard_file_name); this.importData = importData; setTitle(CoreMessages.dialog_project_import_wizard_file_title); setDescription(CoreMessages.dialog_project_import_wizard_file_description); } @Override public boolean isPageComplete() { return importData.isProjectsSelected(this); } @Override public void createControl(Composite parent) { Composite placeholder = UIUtils.createPlaceholder(parent, 1); Composite configGroup = UIUtils.createControlGroup(placeholder, CoreMessages.dialog_project_import_wizard_file_group_input, 3, GridData.FILL_HORIZONTAL, 0); final Text fileNameText = UIUtils.createLabelText(configGroup, CoreMessages.dialog_project_import_wizard_file_label_file, null); //$NON-NLS-2$ fileNameText.addModifyListener(new ModifyListener() { @Override public void modifyText(ModifyEvent e) { String fileName = fileNameText.getText(); if (CommonUtils.isEmpty(fileName)) { importData.setImportFile(null); clearArchive(); } else { importData.setImportFile(new File(fileName)); loadArchive(); } updateState(); } }); Button openFolder = new Button(configGroup, SWT.PUSH); openFolder.setImage(DBeaverIcons.getImage(DBIcon.TREE_FOLDER)); openFolder.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { FileDialog fd = new FileDialog(getShell(), SWT.OPEN | SWT.SINGLE); fd.setText(CoreMessages.dialog_project_import_wizard_file_dialog_export_archive_text); fd.setFilterPath(curFolder); String[] filterExt = {"*.dbp", "*"}; //$NON-NLS-1$ //$NON-NLS-2$ fd.setFilterExtensions(filterExt); String selected = fd.open(); if (selected != null) { curFolder = fd.getFilterPath(); fileNameText.setText(selected); } } }); final Button importDriverCheck = UIUtils.createCheckbox(configGroup, CoreMessages.dialog_project_import_wizard_file_checkbox_import_libraries, true); importDriverCheck.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { importData.setImportDriverLibraries(importDriverCheck.getSelection()); } }); GridData gd = new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING); gd.horizontalSpan = 3; importDriverCheck.setLayoutData(gd); Group projectsGroup = UIUtils.createControlGroup(placeholder, CoreMessages.dialog_project_import_wizard_file_group_projects, 1, GridData.FILL_BOTH, 0); // Project list projectsTable = new Table(projectsGroup, SWT.MULTI | SWT.CHECK | SWT.BORDER | SWT.FULL_SELECTION); projectsTable.setHeaderVisible(true); projectsTable.setLinesVisible(true); gd = new GridData(GridData.FILL_BOTH); projectsTable.setLayoutData(gd); projectsTable.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { updateProjectsSelection(); updateState(); } }); UIUtils.createTableColumn(projectsTable, SWT.LEFT, CoreMessages.dialog_project_import_wizard_file_column_source_name); UIUtils.createTableColumn(projectsTable, SWT.LEFT, CoreMessages.dialog_project_import_wizard_file_column_target_name); final TableEditor tableEditor = new TableEditor(projectsTable); tableEditor.horizontalAlignment = SWT.LEFT; tableEditor.verticalAlignment = SWT.TOP; tableEditor.grabHorizontal = true; projectsTable.addMouseListener(new MouseAdapter() { private void disposeOldEditor() { Control oldEditor = tableEditor.getEditor(); if (oldEditor != null) oldEditor.dispose(); } @Override public void mouseUp(MouseEvent e) { // Clean up any previous editor control disposeOldEditor(); TableItem item = projectsTable.getItem(new Point(e.x, e.y)); if (item == null) { return; } showEditor(item); } private void showEditor(final TableItem item) { // Identify the selected row Text text = new Text(projectsTable, SWT.BORDER); text.setText(item.getText(1)); text.addModifyListener(new ModifyListener() { @Override public void modifyText(ModifyEvent e) { Text text = (Text) tableEditor.getEditor(); item.setText(1, text.getText()); updateProjectsSelection(); updateState(); } }); text.selectAll(); text.setFocus(); tableEditor.setEditor(text, item, 1); } }); UIUtils.packColumns(projectsTable); setControl(placeholder); } private boolean updateProjectsSelection() { importData.clearProjectNameMap(); boolean failed = false; for (TableItem item : projectsTable.getItems()) { boolean validItem = checkProjectItem(item); if (!validItem && item.getChecked()) { failed = true; } } if (!failed) { boolean hasChecked = false; for (TableItem item : projectsTable.getItems()) { if (item.getChecked()) { importData.addProjectName(item.getText(0), item.getText(1)); hasChecked = true; } } if (hasChecked) { setMessage(CoreMessages.dialog_project_import_wizard_file_message_ready, IMessageProvider.INFORMATION); } else { setMessage(CoreMessages.dialog_project_import_wizard_file_message_choose_project, IMessageProvider.INFORMATION); } } return !failed; } private boolean checkProjectItem(TableItem item) { String projectName = item.getText(1); IProject project = DBeaverCore.getInstance().getWorkspace().getRoot().getProject(projectName); if (!project.isAccessible()) { item.setForeground(1, null); return true; } else { if (item.getChecked()) { setMessage(NLS.bind(CoreMessages.dialog_project_import_wizard_file_message_project_exists, projectName), IMessageProvider.ERROR); } item.setForeground(1, projectsTable.getDisplay().getSystemColor(SWT.COLOR_RED)); return false; } } private void updateState() { getContainer().updateButtons(); } private boolean loadArchive() { if (importData.isFileSpecified(this)) { if (importData.getMetaTree() != null) { return true; } clearArchive(); if (importData.loadArchiveMeta(this)) { Document metaTree = importData.getMetaTree(); Element projectsElement = XMLUtils.getChildElement(metaTree.getDocumentElement(), ExportConstants.TAG_PROJECTS); if (projectsElement == null) { setMessage(CoreMessages.dialog_project_import_wizard_file_message_cannt_find_projects, IMessageProvider.ERROR); } else { projectsTable.removeAll(); for (Element projectElement : XMLUtils.getChildElementList(projectsElement, ExportConstants.TAG_PROJECT)) { String projectName = projectElement.getAttribute(ExportConstants.ATTR_NAME); TableItem item = new TableItem(projectsTable, SWT.NONE); item.setImage(DBeaverIcons.getImage(DBIcon.PROJECT)); item.setText(0, projectName); item.setText(1, projectName); } UIUtils.packColumns(projectsTable); updateProjectsSelection(); return true; } } return false; } else { clearArchive(); return false; } } private void clearArchive() { projectsTable.removeAll(); } }