/*
* 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.core.runtime.IProgressMonitor;
import org.eclipse.jface.viewers.ISelectionProvider;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
import org.eclipse.swt.events.FocusEvent;
import org.eclipse.swt.events.FocusListener;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.ui.*;
import org.eclipse.ui.internal.services.INestable;
import org.eclipse.ui.part.MultiPageEditorPart;
import org.eclipse.ui.part.MultiPageEditorSite;
import org.jkiss.code.NotNull;
import org.jkiss.dbeaver.Log;
import org.jkiss.dbeaver.ui.*;
import org.jkiss.dbeaver.registry.editor.EntityEditorDescriptor;
import org.jkiss.dbeaver.ui.controls.folders.ITabbedFolderEditorSite;
import org.jkiss.dbeaver.ui.controls.folders.TabbedFolderPage;
import org.jkiss.dbeaver.ui.editors.IDatabaseEditor;
import org.jkiss.dbeaver.ui.editors.IDatabaseEditorContributorManager;
import org.jkiss.dbeaver.ui.editors.IDatabaseEditorContributorUser;
import org.jkiss.dbeaver.ui.editors.SubEditorSite;
/**
* EditorWrapperSection
*/
public class TabbedFolderPageEditor extends TabbedFolderPage implements IDatabaseEditorContributorUser, ISaveablePart, IRefreshablePart, IAdaptable {
private static final Log log = Log.getLog(TabbedFolderPageEditor.class);
private IDatabaseEditor mainEditor;
private EntityEditorDescriptor editorDescriptor;
private IEditorPart editor;
private IEditorActionBarContributor actionContributor;
private IEditorSite nestedEditorSite;
public TabbedFolderPageEditor(IDatabaseEditor mainEditor, EntityEditorDescriptor editorDescriptor) {
this.mainEditor = mainEditor;
this.editorDescriptor = editorDescriptor;
}
public IEditorPart getEditor() {
return editor;
}
@Override
public void createControl(Composite parent) {
editor = editorDescriptor.createEditor();
final IWorkbenchPartSite ownerSite = this.mainEditor.getSite();
if (ownerSite instanceof MultiPageEditorSite) {
final MultiPageEditorPart ownerMultiPageEditor = ((MultiPageEditorSite) ownerSite).getMultiPageEditor();
nestedEditorSite = new TabbedFolderPageEditorSite(ownerMultiPageEditor, editor);
// Add property change forwarding
// We need it to tell owner editor about dirty state change
if (ownerMultiPageEditor instanceof IPropertyChangeReflector) {
editor.addPropertyListener(new IPropertyListener() {
@Override
public void propertyChanged(Object source, int propId) {
((IPropertyChangeReflector) ownerMultiPageEditor).handlePropertyChange(propId);
}
});
}
} else {
nestedEditorSite = new SubEditorSite(mainEditor.getEditorSite());
}
try {
editor.init(nestedEditorSite, editorDescriptor.getNestedEditorInput(mainEditor.getEditorInput()));
} catch (PartInitException e) {
UIUtils.showErrorDialog(parent.getShell(), "Create SQL viewer", null, e);
}
editor.createPartControl(parent);
if (editor instanceof ISingleControlEditor) {
// Use focus to active selection provider and contributed actions
Control editorControl = ((ISingleControlEditor) editor).getEditorControl();
assert editorControl != null;
editorControl.addFocusListener(new FocusListener() {
@Override
public void focusGained(FocusEvent e) {
ISelectionProvider selectionProvider = editor.getSite().getSelectionProvider();
mainEditor.getSite().setSelectionProvider(selectionProvider);
//selectionProvider.setSelection(selectionProvider.getSelection());
if (actionContributor != null) {
actionContributor.setActiveEditor(editor);
}
activateNestedSite(true);
}
@Override
public void focusLost(FocusEvent e) {
activateNestedSite(false);
if (actionContributor != null) {
actionContributor.setActiveEditor(null);
}
}
});
}
parent.addDisposeListener(new DisposeListener() {
@Override
public void widgetDisposed(DisposeEvent e) {
if (editor != null) {
editor.dispose();
editor = null;
}
}
});
}
@Override
public void dispose() {
if (nestedEditorSite instanceof MultiPageEditorSite) {
((MultiPageEditorSite) nestedEditorSite).dispose();
nestedEditorSite = null;
}
super.dispose();
}
@Override
public void setFocus() {
editor.setFocus();
}
@Override
public void aboutToBeShown() {
if (editor instanceof IActiveWorkbenchPart) {
((IActiveWorkbenchPart) editor).activatePart();
}
}
@Override
public void aboutToBeHidden() {
if (editor instanceof IActiveWorkbenchPart) {
((IActiveWorkbenchPart) editor).deactivatePart();
}
}
@SuppressWarnings("deprecation")
private void activateNestedSite(boolean activate) {
if (nestedEditorSite instanceof INestable) {
if (activate) {
((INestable) nestedEditorSite).activate();
} else {
((INestable) nestedEditorSite).deactivate();
}
}
if (nestedEditorSite instanceof MultiPageEditorSite) {
final IKeyBindingService keyBindingService = ((MultiPageEditorSite) nestedEditorSite).getMultiPageEditor().getEditorSite()
.getKeyBindingService();
if (keyBindingService instanceof INestableKeyBindingService) {
((INestableKeyBindingService) keyBindingService).activateKeyBindingService(activate ? nestedEditorSite : null);
}
}
}
@Override
public void refreshPart(Object source, boolean force) {
if (editor instanceof IRefreshablePart) {
((IRefreshablePart) editor).refreshPart(source, force);
}
// Reload sources
// if (editor instanceof IReusableEditor) {
// ((IReusableEditor) editor).setInput(editorDescriptor.getNestedEditorInput(mainEditor.getEditorInput()));
// }
}
@Override
public <T> T getAdapter(Class<T> adapter) {
if (editor != null) {
if (adapter.isAssignableFrom(editor.getClass())) {
return adapter.cast(editor);
} else {
return editor.getAdapter(adapter);
}
}
return null;
}
@Override
public IEditorActionBarContributor getContributor(IDatabaseEditorContributorManager manager) {
Class<? extends IEditorActionBarContributor> contributorClass = editorDescriptor.getContributorClass();
if (contributorClass == null) {
return null;
}
this.actionContributor = manager.getContributor(contributorClass);
if (this.actionContributor == null) {
try {
this.actionContributor = contributorClass.newInstance();
} catch (Exception e) {
log.error(e);
}
}
return this.actionContributor;
}
@Override
public void doSave(IProgressMonitor monitor) {
if (editor != null) {
editor.doSave(monitor);
}
}
@Override
public void doSaveAs() {
if (editor != null) {
editor.doSaveAs();
}
}
@Override
public boolean isDirty() {
return editor != null && editor.isDirty();
}
@Override
public boolean isSaveAsAllowed() {
return editor != null && editor.isSaveAsAllowed();
}
@Override
public boolean isSaveOnCloseNeeded() {
return editor != null && editor.isSaveOnCloseNeeded();
}
private class TabbedFolderPageEditorSite extends MultiPageEditorSite implements ITabbedFolderEditorSite {
public TabbedFolderPageEditorSite(MultiPageEditorPart multiPageEditor, IEditorPart editor) {
super(multiPageEditor, editor);
}
@NotNull
@Override
public IEditorPart getFolderEditor() {
return mainEditor;
}
}
}