/*
* 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;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.jface.action.IContributionManager;
import org.eclipse.jface.action.Separator;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IEditorSite;
import org.eclipse.ui.IWorkbenchCommandConstants;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.menus.CommandContributionItem;
import org.eclipse.ui.part.EditorPart;
import org.jkiss.code.Nullable;
import org.jkiss.dbeaver.DBException;
import org.jkiss.dbeaver.Log;
import org.jkiss.dbeaver.core.DBeaverCore;
import org.jkiss.dbeaver.core.DBeaverUI;
import org.jkiss.dbeaver.model.navigator.*;
import org.jkiss.dbeaver.model.runtime.VoidProgressMonitor;
import org.jkiss.dbeaver.ui.*;
import org.jkiss.dbeaver.ui.controls.itemlist.ItemListControl;
import org.jkiss.dbeaver.ui.editors.INavigatorEditorInput;
import org.jkiss.dbeaver.ui.navigator.INavigatorModelView;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
/**
* FolderEditor
*/
public class FolderEditor extends EditorPart implements INavigatorModelView, IRefreshablePart, ISearchContextProvider
{
private static final Log log = Log.getLog(FolderEditor.class);
private FolderListControl itemControl;
private List<String> history = new ArrayList<>();
private int historyPosition = 0;
@Override
public void createPartControl(Composite parent)
{
itemControl = new FolderListControl(parent);
itemControl.createProgressPanel();
itemControl.loadData();
getSite().setSelectionProvider(itemControl.getSelectionProvider());
history.add(getRootNode().getNodeItemPath());
}
@Override
public void setFocus() {
itemControl.setFocus();
}
@Override
public void doSave(IProgressMonitor monitor) {
}
@Override
public void doSaveAs() {
}
@Override
public INavigatorEditorInput getEditorInput() {
return (INavigatorEditorInput) super.getEditorInput();
}
@Override
public void init(IEditorSite site, IEditorInput input) throws PartInitException {
setSite(site);
setInput(input);
if (input != null) {
final DBNNode navigatorNode = getEditorInput().getNavigatorNode();
setTitleImage(DBeaverIcons.getImage(navigatorNode.getNodeIcon()));
setPartName(navigatorNode.getNodeName());
}
}
@Override
public boolean isDirty() {
return false;
}
@Override
public boolean isSaveAsAllowed() {
return false;
}
@Override
public DBNNode getRootNode() {
return getEditorInput().getNavigatorNode();
}
@Nullable
@Override
public Viewer getNavigatorViewer()
{
return itemControl.getNavigatorViewer();
}
@Override
public void refreshPart(Object source, boolean force)
{
DBeaverUI.asyncExec(new Runnable() {
@Override
public void run() {
if (!itemControl.isDisposed()) {
itemControl.loadData(false);
}
}
});
}
@Override
public boolean isSearchPossible()
{
return itemControl.isSearchPossible();
}
@Override
public boolean isSearchEnabled()
{
return itemControl.isSearchEnabled();
}
@Override
public boolean performSearch(SearchType searchType)
{
return itemControl.performSearch(searchType);
}
public int getHistoryPosition() {
return historyPosition;
}
public int getHistorySize() {
return history.size();
}
public void navigateHistory(int position) {
if (position >= history.size()) {
position = history.size() - 1;
} else if (position < 0) {
position = -1;
}
if (position < 0 || position >= history.size()) {
return;
}
String nodePath = history.get(position);
try {
DBNNode node = DBeaverCore.getInstance().getNavigatorModel().getNodeByPath(new VoidProgressMonitor(), nodePath);
if (node != null) {
historyPosition = position;
itemControl.changeCurrentNode(node);
}
} catch (DBException e) {
log.error(e);
}
}
private class FolderListControl extends ItemListControl {
public FolderListControl(Composite parent) {
super(parent, SWT.SHEET, FolderEditor.this.getSite(), FolderEditor.this.getEditorInput().getNavigatorNode(), null);
}
@Override
protected void setListData(Collection<DBNNode> items, boolean append) {
if (!append) {
// Add parent node reference (we actually add DBNRoot to avoid unneeded parent properties columns loading)
final DBNNode rootNode = getRootNode();
final DBNNode parentNode = rootNode.getParentNode();
if (parentNode instanceof DBNProjectDatabases || parentNode instanceof DBNLocalFolder || parentNode instanceof DBNResource) {
List<DBNNode> nodesWithParent = new ArrayList<>(items);
nodesWithParent.add(0, DBeaverCore.getInstance().getNavigatorModel().getRoot());
items = nodesWithParent;
}
}
super.setListData(items, append);
}
@Nullable
@Override
protected Object getCellValue(Object element, ObjectColumn objectColumn) {
if (element instanceof DBNRoot) {
return objectColumn.isNameColumn(getObjectValue((DBNRoot)element)) ? ".." : "";
}
return super.getCellValue(element, objectColumn);
}
@Override
protected void openNodeEditor(DBNNode node) {
final DBNNode rootNode = getRootNode();
if (!(node instanceof DBNDatabaseNode)) {
if (node instanceof DBNRoot) {
if (rootNode instanceof DBNLocalFolder) {
node = ((DBNLocalFolder) rootNode).getLogicalParent();
} else {
node = rootNode.getParentNode();
}
}
if (historyPosition >= 0) {
while (historyPosition < history.size() - 1) {
history.remove(historyPosition + 1);
}
}
historyPosition++;
history.add(node.getNodeItemPath());
changeCurrentNode(node);
} else {
super.openNodeEditor(node);
}
}
private void changeCurrentNode(DBNNode node) {
if (getRootNode() != null && node.getClass() != getRootNode().getClass()) {
// Different node type - cleanup
clearListData();
}
setRootNode(node);
loadData();
setPartName(node.getNodeName());
setTitleImage(DBeaverIcons.getImage(node.getNodeIcon()));
updateActions();
// Update editor input
final INavigatorEditorInput editorInput = getEditorInput();
if (editorInput instanceof NodeEditorInput) {
((NodeEditorInput) editorInput).setNavigatorNode(node);
}
}
@Override
protected void fillCustomActions(IContributionManager contributionManager) {
contributionManager.add(ActionUtils.makeCommandContribution(getSite(), IWorkbenchCommandConstants.NAVIGATE_BACKWARD_HISTORY, CommandContributionItem.STYLE_PUSH, UIIcon.RS_BACK));
contributionManager.add(ActionUtils.makeCommandContribution(getSite(), IWorkbenchCommandConstants.NAVIGATE_FORWARD_HISTORY, CommandContributionItem.STYLE_PUSH, UIIcon.RS_FORWARD));
contributionManager.add(new Separator());
super.fillCustomActions(contributionManager);
}
}
}