/* * 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.controls.resultset; import org.eclipse.swt.widgets.Composite; import org.eclipse.ui.IWorkbenchPartSite; import org.jkiss.code.NotNull; import org.jkiss.code.Nullable; import org.jkiss.dbeaver.core.DBeaverUI; import org.jkiss.dbeaver.model.DBPDataSourceContainer; import org.jkiss.dbeaver.model.DBPMessageType; import org.jkiss.dbeaver.model.DBUtils; import org.jkiss.dbeaver.model.IDataSourceContainerProvider; import org.jkiss.dbeaver.model.data.DBDAttributeBinding; import org.jkiss.dbeaver.model.data.DBDRowIdentifier; import org.jkiss.dbeaver.model.data.DBDValueHandler; import org.jkiss.dbeaver.model.exec.DBCAttributeMetaData; import org.jkiss.dbeaver.model.exec.DBCExecutionContext; import org.jkiss.dbeaver.model.struct.DBSAttributeBase; import org.jkiss.dbeaver.model.struct.DBSTypedObject; import org.jkiss.dbeaver.ui.data.IAttributeController; import org.jkiss.dbeaver.ui.data.IRowController; import org.jkiss.dbeaver.ui.data.IValueManager; import org.jkiss.dbeaver.ui.data.registry.ValueManagerRegistry; import java.util.Arrays; import java.util.List; /** * ResultSetValueController */ public class ResultSetValueController implements IAttributeController, IRowController { protected final ResultSetViewer controller; protected final EditType editType; protected final Composite inlinePlaceholder; protected ResultSetRow curRow; protected DBDAttributeBinding binding; public ResultSetValueController( @NotNull IResultSetController controller, @NotNull DBDAttributeBinding binding, @NotNull ResultSetRow row, @NotNull EditType editType, @Nullable Composite inlinePlaceholder) { this.controller = (ResultSetViewer) controller; this.binding = binding; this.curRow = row; this.editType = editType; this.inlinePlaceholder = inlinePlaceholder; } public ResultSetRow getCurRow() { return curRow; } public void setCurRow(ResultSetRow curRow) { this.curRow = curRow; } @Nullable @Override public DBCExecutionContext getExecutionContext() { return controller.getExecutionContext(); } @Override public String getValueName() { return binding.getName(); } @Override public DBSTypedObject getValueType() { return binding.getAttribute(); } @NotNull @Override public IRowController getRowController() { return this; } @NotNull @Override public DBDAttributeBinding getBinding() { return binding; } public void setBinding(DBDAttributeBinding binding) { this.binding = binding; } @NotNull @Override public String getColumnId() { DBCExecutionContext context = getExecutionContext(); DBCAttributeMetaData metaAttribute = binding.getMetaAttribute(); return DBUtils.getSimpleQualifiedName( context == null ? null : context.getDataSource().getContainer().getName(), metaAttribute.getEntityName(), metaAttribute.getName()); } @Override public Object getValue() { return controller.getModel().getCellValue(binding, curRow); } @Override public void updateValue(@Nullable Object value, boolean updatePresentation) { boolean updated = controller.getModel().updateCellValue(binding, curRow, value); if (updated && updatePresentation) { // Update controls DBeaverUI.syncExec(new Runnable() { @Override public void run() { controller.updatePanelsContent(false); } }); controller.fireResultSetChange(); } } @Nullable @Override public DBDRowIdentifier getRowIdentifier() { return binding.getRowIdentifier(); } @Override public DBDValueHandler getValueHandler() { return binding.getValueHandler(); } private DBPDataSourceContainer getDataSourceContainer() { final IResultSetContainer rsContainer = controller.getContainer(); if (rsContainer instanceof IDataSourceContainerProvider) { return ((IDataSourceContainerProvider) rsContainer).getDataSourceContainer(); } else { final DBCExecutionContext executionContext = getExecutionContext(); return executionContext == null ? null : executionContext.getDataSource().getContainer(); } } @Override public IValueManager getValueManager() { DBSAttributeBase valueType = binding.getPresentationAttribute(); final DBCExecutionContext executionContext = getExecutionContext(); Class<?> valueObjectType = getValueHandler().getValueObjectType(valueType); if (valueObjectType == Object.class) { // Try to get type from value itself Object value = getValue(); if (value != null) { valueObjectType = value.getClass(); } } return ValueManagerRegistry.findValueManager( executionContext == null ? null : executionContext.getDataSource(), valueType, valueObjectType); } @Override public EditType getEditType() { return editType; } @Override public boolean isReadOnly() { return controller.getModel().isAttributeReadOnly(binding); } @Override public IWorkbenchPartSite getValueSite() { return controller.getSite(); } @Nullable @Override public Composite getEditPlaceholder() { return inlinePlaceholder; } @Override public void refreshEditor() { controller.updatePanelsContent(true); } @Override public void showMessage(String message, DBPMessageType messageType) { controller.setStatus(message, messageType); } @NotNull @Override public List<DBDAttributeBinding> getRowAttributes() { return Arrays.asList(controller.getModel().getAttributes()); } @Nullable @Override public Object getAttributeValue(DBDAttributeBinding attribute) { return controller.getModel().getCellValue(attribute, curRow); } }