/* * 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.IAdaptable; import org.eclipse.jface.viewers.ISelectionProvider; import org.eclipse.jface.viewers.Viewer; import org.eclipse.swt.SWT; import org.eclipse.swt.events.FocusEvent; import org.eclipse.swt.events.FocusListener; import org.eclipse.swt.widgets.Composite; import org.eclipse.ui.part.MultiPageEditorPart; import org.eclipse.ui.part.MultiPageEditorSite; import org.jkiss.dbeaver.model.navigator.DBNDatabaseNode; import org.jkiss.dbeaver.model.navigator.DBNEvent; import org.jkiss.dbeaver.model.navigator.DBNNode; import org.jkiss.dbeaver.model.navigator.meta.DBXTreeNode; import org.jkiss.dbeaver.ui.*; import org.jkiss.dbeaver.ui.controls.ProgressPageControl; import org.jkiss.dbeaver.ui.controls.folders.TabbedFolderPage; import org.jkiss.dbeaver.ui.controls.itemlist.ItemListControl; import org.jkiss.dbeaver.ui.editors.IDatabaseEditor; import org.jkiss.dbeaver.ui.editors.IDatabaseEditorInput; import org.jkiss.dbeaver.ui.navigator.INavigatorModelView; /** * EntityNodeEditor */ class TabbedFolderPageNode extends TabbedFolderPage implements ISearchContextProvider, IRefreshablePart, INavigatorModelView, IAdaptable { private IDatabaseEditor mainEditor; private DBNNode node; private DBXTreeNode metaNode; private ItemListControl itemControl; private boolean activated; TabbedFolderPageNode(IDatabaseEditor mainEditor, DBNNode node, DBXTreeNode metaNode) { this.mainEditor = mainEditor; this.node = node; this.metaNode = metaNode; } public void setFocus() { if (itemControl != null) { itemControl.setFocus(); } } @Override public void createControl(Composite parent) { itemControl = new ItemListControl(parent, SWT.SHEET, mainEditor.getSite(), node, metaNode); //itemControl.getLayout().marginHeight = 0; //itemControl.getLayout().marginWidth = 0; ProgressPageControl progressControl = null; if (mainEditor instanceof IProgressControlProvider) { progressControl = ((IProgressControlProvider) mainEditor).getProgressControl(); } if (progressControl != null) { itemControl.substituteProgressPanel(progressControl); } else { itemControl.createProgressPanel(); } parent.layout(); // Activate items control on focus itemControl.getItemsViewer().getControl().addFocusListener(new FocusListener() { @Override public void focusGained(FocusEvent e) { // Update selection provider and selection final ISelectionProvider selectionProvider = itemControl.getSelectionProvider(); if (mainEditor.getSite().getSelectionProvider() != selectionProvider) { mainEditor.getSite().setSelectionProvider(selectionProvider); selectionProvider.setSelection(selectionProvider.getSelection()); } itemControl.activate(true); // Notify owner MultiPart editor about page change // We need it to update search actions and other contributions provided by node editor if (mainEditor.getSite() instanceof MultiPageEditorSite) { MultiPageEditorPart multiPageEditor = ((MultiPageEditorSite) mainEditor.getSite()).getMultiPageEditor(); if (multiPageEditor.getSelectedPage() != mainEditor) { multiPageEditor.setActiveEditor(mainEditor); } } } @Override public void focusLost(FocusEvent e) { itemControl.activate(false); } }); } @Override public void aboutToBeShown() { if (!activated) { activated = true; boolean isLazy = !(node instanceof DBNDatabaseNode) || ((DBNDatabaseNode) node).needsInitialization(); itemControl.loadData(isLazy); } } @Override public void aboutToBeHidden() { } public IDatabaseEditorInput getEditorInput() { return mainEditor.getEditorInput(); } @Override public boolean isSearchPossible() { return itemControl.isSearchPossible(); } @Override public boolean isSearchEnabled() { return itemControl.isSearchEnabled(); } @Override public boolean performSearch(SearchType searchType) { return itemControl.performSearch(searchType); } @Override public void refreshPart(Object source, boolean force) { if (!activated || itemControl == null || itemControl.isDisposed()) { return; } // Check - do we need to load new content in editor // If this is DBM event then check node change type // UNLOAD usually means that connection was closed on connection's node is not removed but // is in "unloaded" state. // Without this check editor will try to reload it's content and thus will reopen just closed connection // (by calling getChildren() on DBNNode) boolean loadNewData = true; if (source instanceof DBNEvent) { DBNEvent.NodeChange nodeChange = ((DBNEvent) source).getNodeChange(); if (nodeChange == DBNEvent.NodeChange.UNLOAD) { loadNewData = false; } } if (loadNewData) { itemControl.loadData(false); } } @Override public DBNNode getRootNode() { return itemControl.getRootNode(); } @Override public Viewer getNavigatorViewer() { return itemControl.getNavigatorViewer(); } @Override public <T> T getAdapter(Class<T> adapter) { if (adapter.isAssignableFrom(itemControl.getClass())) { return adapter.cast(itemControl); } return null; } }