/* * 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.ui.preferences; import org.eclipse.core.runtime.IAdaptable; 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.graphics.Color; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.widgets.*; import org.eclipse.ui.IWorkbench; import org.eclipse.ui.IWorkbenchPreferencePage; import org.eclipse.ui.IWorkbenchPropertyPage; import org.jkiss.dbeaver.registry.maven.MavenRegistry; import org.jkiss.dbeaver.registry.maven.MavenRepository; import org.jkiss.dbeaver.ui.UIUtils; import org.jkiss.dbeaver.ui.dialogs.EnterNameDialog; import org.jkiss.utils.CommonUtils; import java.net.MalformedURLException; import java.net.URL; import java.util.ArrayList; import java.util.HashSet; import java.util.Set; /** * PrefPageDriversMaven */ public class PrefPageDriversMaven extends AbstractPrefPage implements IWorkbenchPreferencePage, IWorkbenchPropertyPage { public static final String PAGE_ID = "org.jkiss.dbeaver.preferences.drivers.maven"; //$NON-NLS-1$ private Table mavenRepoTable; private Text idText; private Text nameText; private Text urlText; private Text scopeText; private Text userNameText; private Text userPasswordText; private final Set<MavenRepository> disabledRepositories = new HashSet<>(); private Button disableButton; private Button removeButton; private Button moveUpButton; private Button moveDownButton; private Color enabledColor, disabledColor; @Override public void init(IWorkbench workbench) { } @Override protected Control createContents(Composite parent) { enabledColor = parent.getForeground(); disabledColor = parent.getDisplay().getSystemColor(SWT.COLOR_WIDGET_DARK_SHADOW); Composite composite = UIUtils.createPlaceholder(parent, 1, 5); { Group mavenGroup = UIUtils.createControlGroup(composite, "Repositories", 2, GridData.FILL_BOTH, 300); mavenRepoTable = new Table(mavenGroup, SWT.BORDER | SWT.FULL_SELECTION); UIUtils.createTableColumn(mavenRepoTable, SWT.LEFT, "Id"); UIUtils.createTableColumn(mavenRepoTable, SWT.LEFT, "URL"); mavenRepoTable.setHeaderVisible(true); GridData gd = new GridData(GridData.FILL_BOTH); mavenRepoTable.setLayoutData(gd); Composite buttonsPH = UIUtils.createPlaceholder(mavenGroup, 1); buttonsPH.setLayoutData(new GridData(GridData.VERTICAL_ALIGN_BEGINNING)); UIUtils.createToolButton(buttonsPH, "Add", new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { String urlString = EnterNameDialog.chooseName(getShell(), "Enter Maven repository URL", "http://"); if (urlString != null) { try { URL url = new URL(urlString); MavenRepository repository = new MavenRepository(url.getHost(), url.getHost(), url.toString(), MavenRepository.RepositoryType.CUSTOM); final TableItem item = new TableItem(mavenRepoTable, SWT.NONE); item.setText(new String[]{url.getHost(), urlString}); item.setData(repository); } catch (MalformedURLException e1) { UIUtils.showErrorDialog(getShell(), "Bad URL", "Bad Maven repository URL", e1); } } } }); removeButton = UIUtils.createToolButton(buttonsPH, "Remove", new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { mavenRepoTable.remove(mavenRepoTable.getSelectionIndices()); mavenRepoTable.notifyListeners(SWT.Selection, new Event()); } }); removeButton.setEnabled(false); disableButton = UIUtils.createToolButton(buttonsPH, "Disable", new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { for (TableItem item : mavenRepoTable.getSelection()) { MavenRepository repo = (MavenRepository) item.getData(); if (!disabledRepositories.remove(repo)) { disabledRepositories.add(repo); item.setForeground(disabledColor); } else { item.setForeground(enabledColor); } } mavenRepoTable.notifyListeners(SWT.Selection, new Event()); } }); removeButton.setEnabled(false); moveUpButton = UIUtils.createToolButton(buttonsPH, "Up", new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { final TableItem item = mavenRepoTable.getSelection()[0]; final int index = mavenRepoTable.indexOf(item); if (index > 0) { final TableItem prevItem = mavenRepoTable.getItem(index - 1); switchItems(item, prevItem); mavenRepoTable.setSelection(index - 1); updateSelection(); } } }); moveDownButton = UIUtils.createToolButton(buttonsPH, "Down", new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { final TableItem item = mavenRepoTable.getSelection()[0]; final int index = mavenRepoTable.indexOf(item); if (index < mavenRepoTable.getItemCount() - 1) { final TableItem nextItem = mavenRepoTable.getItem(index + 1); switchItems(item, nextItem); mavenRepoTable.setSelection(index + 1); updateSelection(); } } }); mavenRepoTable.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { updateSelection(); } }); } { Group propsGroup = UIUtils.createControlGroup(composite, "Properties", 2, GridData.FILL_HORIZONTAL, 0); idText = UIUtils.createLabelText(propsGroup, "ID", "", SWT.BORDER | SWT.READ_ONLY); idText.addModifyListener(new ModifyListener() { @Override public void modifyText(ModifyEvent e) { if (getSelectedRepository() != null) { getSelectedRepository().setId(idText.getText()); mavenRepoTable.getSelection()[0].setText(0, idText.getText()); } } }); nameText = UIUtils.createLabelText(propsGroup, "Name", "", SWT.BORDER); nameText.addModifyListener(new ModifyListener() { @Override public void modifyText(ModifyEvent e) { if (getSelectedRepository() != null) { getSelectedRepository().setName(nameText.getText()); } } }); urlText = UIUtils.createLabelText(propsGroup, "URL", "", SWT.BORDER); urlText.addModifyListener(new ModifyListener() { @Override public void modifyText(ModifyEvent e) { if (getSelectedRepository() != null) { getSelectedRepository().setUrl(urlText.getText()); mavenRepoTable.getSelection()[0].setText(1, urlText.getText()); } } }); scopeText = UIUtils.createLabelText(propsGroup, "Scope", "", SWT.BORDER); scopeText.addModifyListener(new ModifyListener() { @Override public void modifyText(ModifyEvent e) { if (getSelectedRepository() != null) { getSelectedRepository().setScopes(CommonUtils.splitString(scopeText.getText(), ',')); } } }); } { Group authGroup = UIUtils.createControlGroup(composite, "Authentication", 4, GridData.FILL_HORIZONTAL, 0); userNameText = UIUtils.createLabelText(authGroup, "User", "", SWT.BORDER); userNameText.addModifyListener(new ModifyListener() { @Override public void modifyText(ModifyEvent e) { if (getSelectedRepository() != null) { getSelectedRepository().getAuthInfo().setUserName(userNameText.getText()); } } }); userPasswordText = UIUtils.createLabelText(authGroup, "Password", "", SWT.BORDER | SWT.PASSWORD); userPasswordText.addModifyListener(new ModifyListener() { @Override public void modifyText(ModifyEvent e) { if (getSelectedRepository() != null) { getSelectedRepository().getAuthInfo().setUserPassword(userPasswordText.getText()); } } }); } performDefaults(); return composite; } private void switchItems(TableItem item1, TableItem item2) { final String id1 = item1.getText(0); final String url1 = item1.getText(1); final Object repo1 = item1.getData(); item1.setText(0, item2.getText(0)); item1.setText(1, item2.getText(1)); item1.setData(item2.getData()); item2.setText(0, id1); item2.setText(1, url1); item2.setData(repo1); } private MavenRepository getSelectedRepository() { TableItem[] selection = mavenRepoTable.getSelection(); if (selection.length == 1) { return (MavenRepository) selection[0].getData(); } return null; } private void updateSelection() { final MavenRepository repo = getSelectedRepository(); if (repo != null) { if (disabledRepositories.contains(repo)) { disableButton.setText("Enable"); } else { disableButton.setText("Disable"); } disableButton.setEnabled(true); final boolean isEditable = repo.getType() == MavenRepository.RepositoryType.CUSTOM; removeButton.setEnabled(isEditable); idText.setEnabled(true); idText.setEditable(isEditable); idText.setText(repo.getId()); nameText.setEnabled(true); nameText.setEditable(isEditable); nameText.setText(repo.getName()); urlText.setEnabled(true); urlText.setEditable(isEditable); urlText.setText(repo.getUrl()); scopeText.setEnabled(true); scopeText.setEditable(isEditable); scopeText.setText(CommonUtils.makeString(repo.getScopes(), ',')); userNameText.setEnabled(true); userNameText.setText(CommonUtils.notEmpty(repo.getAuthInfo().getUserName())); userPasswordText.setEnabled(true); userPasswordText.setText(CommonUtils.notEmpty(repo.getAuthInfo().getUserPassword())); } else { disableButton.setEnabled(false); removeButton.setEnabled(false); idText.setEnabled(false); nameText.setEnabled(false); urlText.setEnabled(false); scopeText.setEnabled(false); userNameText.setEnabled(false); userPasswordText.setEnabled(false); } moveUpButton.setEnabled(mavenRepoTable.getSelectionIndex() > 0); moveDownButton.setEnabled(mavenRepoTable.getSelectionIndex() < mavenRepoTable.getItemCount() - 1); } @Override protected void performDefaults() { for (MavenRepository repo : MavenRegistry.getInstance().getRepositories()) { MavenRepository repoCopy = repo.getType() == MavenRepository.RepositoryType.CUSTOM ? new MavenRepository(repo) : repo; TableItem item = new TableItem(mavenRepoTable, SWT.NONE); item.setText(new String[]{repoCopy.getId(), repoCopy.getUrl()}); item.setData(repoCopy); if (!repo.isEnabled()) { disabledRepositories.add(repo); item.setForeground(disabledColor); } } UIUtils.packColumns(mavenRepoTable, true); updateSelection(); super.performDefaults(); } @Override public boolean performOk() { java.util.List<MavenRepository> customRepos = new ArrayList<>(); TableItem[] items = mavenRepoTable.getItems(); for (int i = 0; i < items.length; i++) { TableItem item = items[i]; MavenRepository repo = (MavenRepository) item.getData(); repo.setEnabled(!disabledRepositories.contains(repo)); repo.setOrder(i); if (repo.getType() == MavenRepository.RepositoryType.CUSTOM) { customRepos.add(repo); } } final MavenRegistry registry = MavenRegistry.getInstance(); registry.setCustomRepositories(customRepos); registry.saveConfiguration(); return super.performOk(); } @Override public IAdaptable getElement() { return null; } @Override public void setElement(IAdaptable element) { } }