/* * 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.views.session; import org.eclipse.jface.action.Action; import org.eclipse.jface.action.IContributionManager; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.SashForm; import org.eclipse.swt.custom.StyledText; import org.eclipse.swt.events.DisposeEvent; import org.eclipse.swt.events.DisposeListener; import org.eclipse.swt.graphics.Font; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.ui.IEditorSite; import org.eclipse.ui.IWorkbenchPart; import org.eclipse.ui.IWorkbenchSite; import org.eclipse.ui.PartInitException; import org.jkiss.dbeaver.model.admin.sessions.DBAServerSession; import org.jkiss.dbeaver.model.admin.sessions.DBAServerSessionManager; import org.jkiss.dbeaver.model.exec.DBCExecutionContext; import org.jkiss.dbeaver.runtime.properties.PropertyCollector; import org.jkiss.dbeaver.ui.DBeaverIcons; import org.jkiss.dbeaver.ui.UIIcon; import org.jkiss.dbeaver.ui.UIUtils; import org.jkiss.dbeaver.ui.editors.StringEditorInput; import org.jkiss.dbeaver.ui.editors.SubEditorSite; import org.jkiss.dbeaver.ui.editors.sql.SQLEditorBase; import org.jkiss.dbeaver.ui.properties.PropertyTreeViewer; import org.jkiss.dbeaver.utils.GeneralUtils; import org.jkiss.utils.CommonUtils; import java.util.Map; /** * SessionManagerViewer */ public class SessionManagerViewer { private SessionListControl sessionTable; //private Text sessionInfo; private IEditorSite subSite; private SQLEditorBase sqlViewer; private Font boldFont; private PropertyTreeViewer sessionProps; private DBAServerSession curSession; public void dispose() { sessionTable.disposeControl(); UIUtils.dispose(boldFont); } public SessionManagerViewer(IWorkbenchPart part, Composite parent, final DBAServerSessionManager sessionManager) { this.subSite = new SubEditorSite(part.getSite()); boldFont = UIUtils.makeBoldFont(parent.getFont()); Composite composite = UIUtils.createPlaceholder(parent, 1); SashForm sash = UIUtils.createPartDivider(part, composite, SWT.VERTICAL | SWT.SMOOTH); sash.setLayoutData(new GridData(GridData.FILL_BOTH)); sessionTable = new SessionListControl(sash, part.getSite(), sessionManager); sessionTable.getItemsViewer().addSelectionChangedListener(new ISelectionChangedListener() { @Override public void selectionChanged(SelectionChangedEvent event) { onSessionSelect(getSelectedSession()); } }); sessionTable.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); sessionTable.createProgressPanel(composite); { SashForm infoSash = UIUtils.createPartDivider(part, sash, SWT.HORIZONTAL | SWT.SMOOTH); infoSash.setLayoutData(new GridData(GridData.FILL_BOTH)); // sessionInfo = new Text(infoSash, SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL | SWT.MULTI | SWT.WRAP); // sessionInfo.setEditable(false); // sessionInfo.setLayoutData(new GridData(GridData.FILL_BOTH)); sqlViewer = new SQLEditorBase() { @Override public DBCExecutionContext getExecutionContext() { return sessionManager.getDataSource().getDefaultContext(false); } }; updateSQL(); sqlViewer.createPartControl(infoSash); Object text = sqlViewer.getAdapter(Control.class); if (text instanceof StyledText) { ((StyledText) text).setWordWrap(true); } sqlViewer.reloadSyntaxRules(); parent.addDisposeListener(new DisposeListener() { @Override public void widgetDisposed(DisposeEvent e) { sqlViewer.dispose(); } }); sessionProps = new PropertyTreeViewer(infoSash, SWT.BORDER); sash.setWeights(new int[]{50, 50}); } sash.setWeights(new int[]{70, 30}); } protected void onSessionSelect(DBAServerSession session) { curSession = session; updateSQL(); if (session == null) { sessionProps.clearProperties(); } else { PropertyCollector propCollector = new PropertyCollector(session, true); propCollector.collectProperties(); sessionProps.loadProperties(propCollector); } } protected void contributeToToolbar(DBAServerSessionManager sessionManager, IContributionManager contributionManager) { } public DBAServerSession getSelectedSession() { ISelection selection = sessionTable.getSelectionProvider().getSelection(); if (selection instanceof IStructuredSelection && !selection.isEmpty()) { return (DBAServerSession)((IStructuredSelection) selection).getFirstElement(); } else { return null; } } public void refreshSessions() { sessionTable.loadData(); onSessionSelect(null); } public void alterSession(final DBAServerSession session, Map<String, Object> options) { sessionTable.createAlterService(session, options).schedule(); } protected void updateSQL() { try { String text = curSession == null ? "" : CommonUtils.notEmpty(curSession.getActiveQuery()); StringEditorInput sqlInput = new StringEditorInput(sessionTable.getShell().getText(), text, true, GeneralUtils.getDefaultFileEncoding()); sqlViewer.init(subSite, sqlInput); if (sqlViewer.getTextViewer() != null) { sqlViewer.reloadSyntaxRules(); } } catch (PartInitException e) { UIUtils.showErrorDialog(sessionTable.getShell(), sessionTable.getShell().getText(), null, e); } } private class SessionListControl extends SessionTable { public SessionListControl(SashForm sash, IWorkbenchSite site, DBAServerSessionManager<DBAServerSession> sessionManager) { super(sash, SWT.SHEET, site, sessionManager); } @Override protected void fillCustomActions(IContributionManager contributionManager) { contributeToToolbar(getSessionManager(), contributionManager); contributionManager.add(new Action("Refresh sessions", DBeaverIcons.getImageDescriptor(UIIcon.REFRESH)) { @Override public void run() { refreshSessions(); } }); } } }