/* * DBeaver - Universal Database Manager * Copyright (C) 2010-2017 Serge Rider (serge@jkiss.org) * Copyright (C) 2011-2012 Eugene Fradkin (eugene.fradkin@gmail.com) * * 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.dialogs.connection; import org.jkiss.dbeaver.Log; import org.eclipse.jface.dialogs.IDialogConstants; import org.eclipse.osgi.util.NLS; import org.eclipse.swt.SWT; import org.eclipse.swt.events.DisposeEvent; import org.eclipse.swt.events.DisposeListener; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.graphics.Font; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.*; import org.jkiss.dbeaver.DBException; import org.jkiss.dbeaver.core.CoreMessages; import org.jkiss.dbeaver.model.connection.DBPClientHome; import org.jkiss.dbeaver.model.connection.DBPClientManager; import org.jkiss.dbeaver.model.connection.DBPDriver; import org.jkiss.dbeaver.registry.driver.DriverDescriptor; import org.jkiss.dbeaver.ui.DBeaverIcons; import org.jkiss.dbeaver.ui.UIIcon; import org.jkiss.dbeaver.ui.UIUtils; import org.jkiss.utils.ArrayUtils; import org.jkiss.utils.CommonUtils; import java.util.ArrayList; import java.util.Collection; import java.util.LinkedHashSet; import java.util.Set; /** * ClientHomesPanel */ public class ClientHomesPanel extends Composite { private static final Log log = Log.getLog(ClientHomesPanel.class); private static String lastHomeDirectory; private Table homesTable; private Text idText; private Text pathText; private Text nameText; private Text productNameText; private Text productVersionText; private Button removeButton; private Font fontBold; private Font fontItalic; private DBPDriver driver; static class HomeInfo { DBPClientHome home; boolean isProvided; boolean isDefault; HomeInfo(DBPClientHome home) { this.home = home; } } public ClientHomesPanel( Composite parent, int style) { super(parent, style); fontBold = UIUtils.makeBoldFont(parent.getFont()); fontItalic = UIUtils.modifyFont(parent.getFont(), SWT.ITALIC); addDisposeListener(new DisposeListener() { @Override public void widgetDisposed(DisposeEvent e) { UIUtils.dispose(fontBold); UIUtils.dispose(fontItalic); } }); GridLayout layout = new GridLayout(2, false); setLayout(layout); Composite listGroup = UIUtils.createPlaceholder(this, 1, 5); listGroup.setLayoutData(new GridData(GridData.FILL_VERTICAL)); ((GridData)(listGroup.getLayoutData())).minimumWidth = 200; homesTable = new Table(listGroup, SWT.SINGLE | SWT.BORDER | SWT.FULL_SELECTION | SWT.H_SCROLL | SWT.V_SCROLL); homesTable.setLayoutData(new GridData(GridData.FILL_BOTH)); homesTable.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { TableItem[] selection = homesTable.getSelection(); if (ArrayUtils.isEmpty(selection)) { selectHome(null); } else { selectHome((HomeInfo)selection[0].getData()); } } }); Composite buttonsGroup = UIUtils.createPlaceholder(listGroup, 2, 5); buttonsGroup.setLayoutData(new GridData(GridData.FILL_HORIZONTAL | GridData.HORIZONTAL_ALIGN_END)); Button addButton = new Button(buttonsGroup, SWT.PUSH); addButton.setText(CoreMessages.controls_client_homes_panel_button_add_home); addButton.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { addClientHome(); } }); removeButton = new Button(buttonsGroup, SWT.PUSH); removeButton.setText(CoreMessages.controls_client_homes_panel_button_remove_home); removeButton.setEnabled(false); removeButton.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { TableItem[] selection = homesTable.getSelection(); if (!ArrayUtils.isEmpty(selection)) { removeClientHome(); } } }); Group infoGroup = UIUtils.createControlGroup(this, CoreMessages.controls_client_homes_panel_group_information, 2, GridData.VERTICAL_ALIGN_BEGINNING | GridData.FILL_HORIZONTAL, 0); ((GridData)(infoGroup.getLayoutData())).minimumWidth = 300; idText = UIUtils.createLabelText(infoGroup, CoreMessages.controls_client_homes_panel_label_id, null, SWT.BORDER | SWT.READ_ONLY); pathText = UIUtils.createLabelText(infoGroup, CoreMessages.controls_client_homes_panel_label_path, null, SWT.BORDER | SWT.READ_ONLY); nameText = UIUtils.createLabelText(infoGroup, CoreMessages.controls_client_homes_panel_label_name, null, SWT.BORDER | SWT.READ_ONLY); productNameText = UIUtils.createLabelText(infoGroup, CoreMessages.controls_client_homes_panel_label_product_name, null, SWT.BORDER | SWT.READ_ONLY); productVersionText = UIUtils.createLabelText(infoGroup, CoreMessages.controls_client_homes_panel_label_product_version, null, SWT.BORDER | SWT.READ_ONLY); } private void removeClientHome() { int selIndex = homesTable.getSelectionIndex(); HomeInfo info = (HomeInfo) homesTable.getItem(selIndex).getData(); if (!info.isProvided) { if (UIUtils.confirmAction( getShell(), CoreMessages.controls_client_homes_panel_confirm_remove_home_title, NLS.bind(CoreMessages.controls_client_homes_panel_confirm_remove_home_text, info.home.getHomeId()))) { homesTable.remove(selIndex); selectHome(null); } } } private void addClientHome() { DirectoryDialog directoryDialog = new DirectoryDialog(getShell()); if (lastHomeDirectory != null) { directoryDialog.setFilterPath(lastHomeDirectory); } String homeId = directoryDialog.open(); if (homeId == null) { return; } lastHomeDirectory = homeId; DBPClientManager clientManager = driver.getClientManager(); if (clientManager != null) { createHomeItem(clientManager, homeId, false); } } private void selectHome(HomeInfo home) { removeButton.setEnabled(home != null && !home.isProvided); idText.setText(home == null ? "" : CommonUtils.notEmpty(home.home.getHomeId())); //$NON-NLS-1$ pathText.setText(home == null ? "" : home.home.getHomePath().getAbsolutePath()); //$NON-NLS-1$ nameText.setText(home == null ? "" : CommonUtils.notEmpty(home.home.getDisplayName())); //$NON-NLS-1$ try { productNameText.setText(home == null ? "" : CommonUtils.notEmpty(home.home.getProductName())); //$NON-NLS-1$ } catch (DBException e) { log.warn(e); } try { productVersionText.setText(home == null ? "" : CommonUtils.notEmpty(home.home.getProductVersion())); //$NON-NLS-1$ } catch (DBException e) { log.warn(e); } } public Collection<String> getHomeIds() { java.util.List<String> homes = new ArrayList<>(); for (TableItem item : homesTable.getItems()) { homes.add(((HomeInfo)item.getData()).home.getHomeId()); } return homes; } public void loadHomes(DBPDriver driver) { homesTable.removeAll(); selectHome(null); this.driver = driver; DBPClientManager clientManager = this.driver.getClientManager(); if (clientManager == null) { log.error("Client manager is not supported by driver '" + driver.getName() + "'"); //$NON-NLS-1$ //$NON-NLS-2$ return; } Set<String> providedHomes = new LinkedHashSet<>( clientManager.findClientHomeIds()); Set<String> allHomes = new LinkedHashSet<>(providedHomes); allHomes.addAll(driver.getClientHomeIds()); for (String homeId : allHomes) { TableItem item = createHomeItem(clientManager, homeId, providedHomes.contains(homeId)); if (item != null) { HomeInfo homeInfo = (HomeInfo) item.getData(); if (homeInfo.isDefault) { homesTable.setSelection(homesTable.indexOf(item)); selectHome(homeInfo); } } } } private TableItem createHomeItem(DBPClientManager clientManager, String homeId, boolean provided) { DBPClientHome home; try { home = clientManager.getClientHome(homeId); if (home == null) { log.warn("Home '" + homeId + "' is not supported"); //$NON-NLS-1$ //$NON-NLS-2$ return null; } } catch (Exception e) { log.error(e); return null; } HomeInfo homeInfo = new HomeInfo(home); homeInfo.isProvided = provided; homeInfo.isDefault = home.getHomeId().equals(clientManager.getDefaultClientHomeId()); TableItem homeItem = new TableItem(homesTable, SWT.NONE); homeItem.setText(home.getDisplayName()); homeItem.setImage(DBeaverIcons.getImage(UIIcon.HOME)); homeItem.setData(homeInfo); if (!homeInfo.isProvided) { homeItem.setFont(fontItalic); } else { if (homeInfo.isDefault) { homeItem.setFont(fontBold); } } return homeItem; } private String getSelectedHome() { TableItem[] selection = homesTable.getSelection(); if (ArrayUtils.isEmpty(selection)) { return null; } else { return ((HomeInfo)selection[0].getData()).home.getHomeId(); } } private static class ChooserDialog extends org.eclipse.jface.dialogs.Dialog { private DBPDriver driver; private ClientHomesPanel panel; private String selectedHome; protected ChooserDialog(Shell parentShell, DBPDriver driver) { super(parentShell); this.driver = driver; } @Override protected Control createDialogArea(Composite parent) { getShell().setText(CoreMessages.controls_client_homes_panel_dialog_title); panel = new ClientHomesPanel(parent, SWT.NONE); GridData gd = new GridData(GridData.FILL_BOTH); //gd.widthHint = 500; panel.setLayoutData(gd); panel.loadHomes(driver); return parent; } @Override protected boolean isResizable() { return true; } @Override protected void buttonPressed(int buttonId) { if (IDialogConstants.OK_ID == buttonId) { selectedHome = panel.getSelectedHome(); if (driver instanceof DriverDescriptor) { ((DriverDescriptor) driver).setClientHomeIds(panel.getHomeIds()); ((DriverDescriptor) driver).getProviderDescriptor().getRegistry().saveDrivers(); } } super.buttonPressed(buttonId); } } public static String chooseClientHome(Shell parent, DBPDriver driver) { ChooserDialog dialog = new ChooserDialog(parent, driver); if (dialog.open() == IDialogConstants.OK_ID) { return dialog.selectedHome; } else { return null; } } }