/******************************************************************************* * Copyright (c) 2006-2013 The RCP Company and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * The RCP Company - initial API and implementation *******************************************************************************/ package com.rcpcompany.uibindings.internal.utils; import java.util.List; import org.eclipse.core.runtime.Assert; import org.eclipse.jface.fieldassist.ContentProposalAdapter; import org.eclipse.jface.fieldassist.IContentProposal; import org.eclipse.jface.fieldassist.IContentProposalListener; import org.eclipse.jface.fieldassist.IContentProposalProvider; import org.eclipse.jface.fieldassist.IControlContentAdapter; import org.eclipse.jface.viewers.BaseLabelProvider; import org.eclipse.jface.viewers.ILabelProvider; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.graphics.Rectangle; import org.eclipse.swt.widgets.Control; import org.eclipse.ui.ISharedImages; import org.eclipse.ui.PlatformUI; import com.rcpcompany.uibindings.IBindingMessage; import com.rcpcompany.uibindings.bindingMessages.AbstractBindingMessage; import com.rcpcompany.uibindings.utils.IBindingMessagesPopup; /** * Popup dialog that can show a list of messages. * * @author Tonny Madsen, The RCP Company */ public class BindingMessagesPopup extends ContentProposalAdapter implements IBindingMessagesPopup { /** * Constructs and returns a new message popup. * * @param control the control that should have the popup assiciated. * @param messages the messages to show */ public BindingMessagesPopup(Control control) { super(control, new MyControlContentAdapter(), null, null, null); setProposalAcceptanceStyle(ContentProposalAdapter.PROPOSAL_IGNORE); addContentProposalListener(new IContentProposalListener() { @Override public void proposalAccepted(IContentProposal proposal) { Assert.isNotNull(proposal); final IBindingMessage message = ((MyContentProposal) proposal).getMessage(); message.getBinding().setFocus(); } }); setLabelProvider(new MyQuickfixLabelProvider()); } /** * Opens the adapter. */ @Override public void open(List<IBindingMessage> messages) { setContentProposalProvider(new MyContentProposalProvider(messages)); openProposalPopup(); } @Override public void dispose() { closeProposalPopup(); } /** * A single proposal... */ protected static class MyContentProposal implements IContentProposal { private final IBindingMessage myMessage; /** * Constructs and returns a new proposal based on the specified message * * @param message the message */ protected MyContentProposal(IBindingMessage message) { myMessage = message; } @Override public String getContent() { return null; } @Override public int getCursorPosition() { return 0; } @Override public String getDescription() { return null; } @Override public String getLabel() { return getMessage().getMessage(); } /** * Returns the message that backs this proposal. * * @return the message */ public IBindingMessage getMessage() { return myMessage; } } /** * A simple content provider... */ protected static class MyContentProposalProvider implements IContentProposalProvider { /** * The messages to show */ public final IContentProposal[] myMessages; /** * Constructs and returns new provider. * * @param messages the messages of the provider */ protected MyContentProposalProvider(List<IBindingMessage> messages) { myMessages = new IContentProposal[messages.size()]; for (int i = 0; i < messages.size(); i++) { final IBindingMessage m = messages.get(i); myMessages[i] = new MyContentProposal(m); } } @Override public IContentProposal[] getProposals(String contents, int position) { return myMessages; } }; /** * A label provider for the messages.. */ protected static class MyQuickfixLabelProvider extends BaseLabelProvider implements ILabelProvider { @Override public String getText(Object proposal) { Assert.isNotNull(proposal); final IBindingMessage message = ((MyContentProposal) proposal).getMessage(); return AbstractBindingMessage.getFullMessage(message); } @Override public Image getImage(Object proposal) { Assert.isNotNull(proposal); final IBindingMessage message = ((MyContentProposal) proposal).getMessage(); switch (message.getSeverity()) { case ERROR: return PlatformUI.getWorkbench().getSharedImages().getImage(ISharedImages.IMG_OBJS_ERROR_TSK); case WARNING: return PlatformUI.getWorkbench().getSharedImages().getImage(ISharedImages.IMG_OBJS_WARN_TSK); case INFORMATION: return PlatformUI.getWorkbench().getSharedImages().getImage(ISharedImages.IMG_OBJS_INFO_TSK); case NONE: return null; } return null; } } /** * A null ControlContentAdapter that does... nothing... */ protected static class MyControlContentAdapter implements IControlContentAdapter { @Override public String getControlContents(Control control) { return ""; } @Override public int getCursorPosition(Control control) { return 0; } @Override public Rectangle getInsertionBounds(Control control) { return null; } @Override public void insertControlContents(Control control, String contents, int cursorPosition) { } @Override public void setControlContents(Control control, String contents, int cursorPosition) { } @Override public void setCursorPosition(Control control, int index) { } } }