/* * 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.editors.entity.properties; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.jface.viewers.ColumnLabelProvider; import org.eclipse.jface.viewers.IFontProvider; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.swt.SWT; import org.eclipse.swt.events.DisposeEvent; import org.eclipse.swt.events.DisposeListener; import org.eclipse.swt.graphics.Font; import org.eclipse.swt.widgets.Composite; import org.eclipse.ui.*; import org.eclipse.ui.progress.UIJob; import org.jkiss.dbeaver.model.*; import org.jkiss.dbeaver.model.preferences.DBPPropertyDescriptor; import org.jkiss.dbeaver.model.preferences.DBPPropertySource; import org.jkiss.dbeaver.model.struct.DBSObject; import org.jkiss.dbeaver.runtime.properties.ILazyPropertyLoadListener; import org.jkiss.dbeaver.runtime.properties.PropertiesContributor; import org.jkiss.dbeaver.ui.IRefreshablePart; import org.jkiss.dbeaver.ui.UIUtils; import org.jkiss.dbeaver.ui.controls.folders.TabbedFolderPage; import org.jkiss.dbeaver.ui.editors.IDatabaseEditorInput; import org.jkiss.dbeaver.ui.properties.PropertyTreeViewer; import org.jkiss.utils.CommonUtils; /** * TabbedFolderPageProperties */ public class TabbedFolderPageProperties extends TabbedFolderPage implements ILazyPropertyLoadListener, IRefreshablePart, DBPEventListener { protected IWorkbenchPart part; protected IDatabaseEditorInput input; protected PropertyTreeViewer propertyTree; private Font boldFont; private UIJob refreshJob = null; private DBPPropertySource curPropertySource; public TabbedFolderPageProperties(IWorkbenchPart part, IDatabaseEditorInput input) { this.part = part; this.input = input; } @Override public void createControl(Composite parent) { this.boldFont = UIUtils.makeBoldFont(parent.getFont()); propertyTree = new PropertyTreeViewer(parent, SWT.NONE); propertyTree.setExtraLabelProvider(new PropertyLabelProvider()); propertyTree.setExpandMode(PropertyTreeViewer.ExpandMode.FIRST); propertyTree.addSelectionChangedListener(new ISelectionChangedListener() { @Override public void selectionChanged(SelectionChangedEvent event) { IWorkbenchPartSite site = part.getSite(); IActionBars actionBars = null; if (site instanceof IEditorSite) { actionBars = ((IEditorSite) site).getActionBars(); } else if (site instanceof IViewSite) { actionBars = ((IViewSite) site).getActionBars(); } if (actionBars != null) { String statusText = null; Object selection = propertyTree.getStructuredSelection().getFirstElement(); DBPPropertyDescriptor prop = propertyTree.getPropertyFromElement(selection); if (prop != null) { statusText = prop.getDescription(); if (CommonUtils.isEmpty(statusText)) { statusText = prop.getDisplayName(); } } if (CommonUtils.isEmpty(statusText)) { statusText = CommonUtils.toString(selection); } actionBars.getStatusLineManager().setMessage(CommonUtils.notEmpty(statusText)); } } }); PropertiesContributor.getInstance().addLazyListener(this); curPropertySource = input.getPropertySource(); propertyTree.loadProperties(curPropertySource); if (input.getDatabaseObject() != null) { DBUtils.getObjectRegistry((DBSObject) curPropertySource.getEditableValue()).addDataSourceListener(this); } propertyTree.getControl().addDisposeListener(new DisposeListener() { @Override public void widgetDisposed(DisposeEvent e) { dispose(); } }); } @Override public void setFocus() { propertyTree.getControl().setFocus(); } @Override public void dispose() { if (curPropertySource.getEditableValue() instanceof DBSObject) { DBUtils.getObjectRegistry((DBSObject) curPropertySource.getEditableValue()).removeDataSourceListener(this); } UIUtils.dispose(boldFont); PropertiesContributor.getInstance().removeLazyListener(this); super.dispose(); } @Override public void handlePropertyLoad(Object object, DBPPropertyDescriptor property, Object propertyValue, boolean completed) { if (curPropertySource.getEditableValue() == object && !propertyTree.getControl().isDisposed()) { refreshProperties(); } } private void refreshProperties() { synchronized (this) { if (refreshJob == null) { refreshJob = new RefreshJob(); refreshJob.schedule(100); } } } @Override public void handleDataSourceEvent(DBPEvent event) { if (input.getDatabaseObject() == event.getObject() && !Boolean.FALSE.equals(event.getEnabled()) && !propertyTree.getControl().isDisposed()) { refreshProperties(); } } @Override public void refreshPart(Object source, boolean force) { if (force) { curPropertySource = input.getPropertySource(); propertyTree.loadProperties(curPropertySource); refreshProperties(); } } private class PropertyLabelProvider extends ColumnLabelProvider implements IFontProvider { @Override public Font getFont(Object element) { if (element instanceof DBPPropertyDescriptor && curPropertySource != null && ((DBPPropertyDescriptor) element).isEditable(curPropertySource.getEditableValue())) { return boldFont; } return null; } } private class RefreshJob extends UIJob { public RefreshJob() { super("Refresh properties"); } @Override public IStatus runInUIThread(IProgressMonitor monitor) { if (!propertyTree.getControl().isDisposed()) { propertyTree.refresh(); // Force control redraw (to repaint hyperlinks and other stuff) propertyTree.getControl().redraw(); } synchronized (TabbedFolderPageProperties.this) { refreshJob = null; } return Status.OK_STATUS; } } }