/* * 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.jface.dialogs.Dialog; import org.eclipse.jface.resource.JFaceColors; import org.eclipse.jface.resource.JFaceResources; import org.eclipse.swt.SWT; import org.eclipse.swt.events.*; import org.eclipse.swt.graphics.Color; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.*; import org.jkiss.code.NotNull; import org.jkiss.code.Nullable; import org.jkiss.dbeaver.model.DBPMessageType; import org.jkiss.dbeaver.ui.DBeaverIcons; import org.jkiss.dbeaver.ui.TextUtils; import org.jkiss.dbeaver.ui.UIIcon; import org.jkiss.dbeaver.ui.UIUtils; import org.jkiss.dbeaver.utils.RuntimeUtils; /** * Status label */ class StatusLabel extends Composite { private final ResultSetViewer viewer; private final Label statusIcon; private final Text statusText; private final Color colorDefault, colorError, colorWarning; private DBPMessageType messageType; public StatusLabel(@NotNull Composite parent, int style, @Nullable final ResultSetViewer viewer) { super(parent, SWT.BORDER); this.viewer = viewer; setBackgroundMode(SWT.INHERIT_FORCE); final GridLayout layout = new GridLayout(3, false); layout.marginHeight = 0; layout.marginWidth = 2; layout.horizontalSpacing = 3; setLayout(layout); colorDefault = getForeground(); colorError = JFaceColors.getErrorText(Display.getDefault()); colorWarning = colorDefault; final Image statusImage = JFaceResources.getImage(Dialog.DLG_IMG_MESSAGE_INFO); statusIcon = new Label(this, SWT.NONE); statusIcon.setImage(statusImage); statusIcon.setToolTipText("Status information"); GridData gd = new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING); statusIcon.setLayoutData(gd); statusText = new Text(this, SWT.SINGLE | SWT.READ_ONLY); if (RuntimeUtils.isPlatformWindows()) { statusText.setBackground(null); } else { statusText.setBackground(parent.getBackground()); } gd = new GridData(GridData.FILL_HORIZONTAL); gd.minimumHeight = statusImage.getBounds().height; statusText.setLayoutData(gd); UIUtils.enableHostEditorKeyBindingsSupport(viewer.getSite(), this.statusText); UIUtils.addFocusTracker(viewer.getSite(), UIUtils.INLINE_WIDGET_EDITOR_ID, this.statusText); this.statusText.addDisposeListener(new DisposeListener() { @Override public void widgetDisposed(DisposeEvent e) { // Unregister from focus service UIUtils.removeFocusTracker(viewer.getSite(), statusText); } }); final ToolBar tb = new ToolBar(this, SWT.HORIZONTAL); final ToolItem detailsIcon = new ToolItem(tb, SWT.NONE); detailsIcon.setImage(DBeaverIcons.getImage(UIIcon.TEXTFIELD)); tb.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING)); detailsIcon.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { showDetails(); } }); statusText.addTraverseListener(new TraverseListener() { @Override public void keyTraversed(TraverseEvent e) { if (e.detail == SWT.TRAVERSE_RETURN) { showDetails(); } } }); } protected void showDetails() { StatusDetailsDialog dialog = new StatusDetailsDialog( viewer, getMessage(), viewer.getDataReceiver().getErrorList()); dialog.open(); } public void setStatus(String message) { this.setStatus(message, DBPMessageType.INFORMATION); } public void setStatus(String message, DBPMessageType messageType) { if (statusText.isDisposed()) { return; } this.messageType = messageType; Color fg; String statusIconId; switch (messageType) { case ERROR: fg = colorError; statusIconId = Dialog.DLG_IMG_MESSAGE_ERROR; break; case WARNING: fg = colorWarning; statusIconId = Dialog.DLG_IMG_MESSAGE_WARNING; break; default: fg = colorDefault; statusIconId = Dialog.DLG_IMG_MESSAGE_INFO; break; } statusText.setForeground(fg); if (message == null) { message = "???"; //$NON-NLS-1$ } statusIcon.setImage(JFaceResources.getImage(statusIconId)); statusText.setText(TextUtils.getSingleLineString(message)); if (messageType != DBPMessageType.INFORMATION) { statusText.setToolTipText(message); } else { statusText.setToolTipText(null); } } public String getMessage() { return statusText.getText(); } public DBPMessageType getMessageType() { return messageType; } public void setUpdateListener(Runnable runnable) { } }