diff options
Diffstat (limited to 'org.eclipse.ui.genericeditor/src/org/eclipse/ui/internal/genericeditor/hover/CompositeInformationControlCreator.java')
-rw-r--r-- | org.eclipse.ui.genericeditor/src/org/eclipse/ui/internal/genericeditor/hover/CompositeInformationControlCreator.java | 120 |
1 files changed, 120 insertions, 0 deletions
diff --git a/org.eclipse.ui.genericeditor/src/org/eclipse/ui/internal/genericeditor/hover/CompositeInformationControlCreator.java b/org.eclipse.ui.genericeditor/src/org/eclipse/ui/internal/genericeditor/hover/CompositeInformationControlCreator.java new file mode 100644 index 00000000000..ddeee67056c --- /dev/null +++ b/org.eclipse.ui.genericeditor/src/org/eclipse/ui/internal/genericeditor/hover/CompositeInformationControlCreator.java @@ -0,0 +1,120 @@ +/******************************************************************************* + * Copyright (c) 2017 Red Hat Inc. 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: + * - Mickael Istria (Red Hat Inc.) + *******************************************************************************/ +package org.eclipse.ui.internal.genericeditor.hover; + +import java.util.Iterator; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map.Entry; + +import org.eclipse.jface.text.AbstractReusableInformationControlCreator; +import org.eclipse.jface.text.DefaultInformationControl; +import org.eclipse.jface.text.IInformationControl; +import org.eclipse.jface.text.IInformationControlCreator; +import org.eclipse.jface.text.IInformationControlCreatorExtension; +import org.eclipse.jface.text.ITextHover; +import org.eclipse.jface.text.ITextHoverExtension; +import org.eclipse.swt.widgets.Shell; + +public class CompositeInformationControlCreator + implements IInformationControlCreator, IInformationControlCreatorExtension { + + private final LinkedHashMap<ITextHover, IInformationControlCreator> creators; + + public CompositeInformationControlCreator(List<ITextHover> hovers) { + this.creators = new LinkedHashMap<>(); + for (ITextHover hover : hovers) { + creators.put(hover, getInformationControlCreator(hover)); + } + } + + public CompositeInformationControlCreator(LinkedHashMap<ITextHover, IInformationControlCreator> creators) { + this.creators = creators; + } + + private static IInformationControlCreator getInformationControlCreator(ITextHover hover) { + IInformationControlCreator controlCreator = null; + if (hover instanceof ITextHoverExtension) { + controlCreator = ((ITextHoverExtension)hover).getHoverControlCreator(); + } + if (controlCreator == null) { + controlCreator = new AbstractReusableInformationControlCreator() { + @Override + protected IInformationControl doCreateInformationControl(Shell parent) { + return new DefaultInformationControl(parent, true); + } + }; + } + return controlCreator; + } + + + @Override + public boolean canReuse(IInformationControl control) { + if (control.getClass() != CompositeInformationControl.class) { + return false; + } + CompositeInformationControl other = (CompositeInformationControl)control; + if (!other.creators.equals(this.creators)) { + return false; + } + Iterator<Entry<ITextHover, IInformationControlCreator>> thisIterator = this.creators.entrySet().iterator(); + Iterator<Entry<ITextHover, IInformationControl>> otherIterator = other.controls.entrySet().iterator(); + do { + Entry<ITextHover, IInformationControlCreator> thisEntry = thisIterator.next(); + Entry<ITextHover, IInformationControl> otherEntry = otherIterator.next(); + if (!thisEntry.getKey().equals(otherEntry.getKey())) { + return false; + } + if (!(thisEntry.getValue() instanceof IInformationControlCreatorExtension)) { + return false; + } + if (!((IInformationControlCreatorExtension)thisEntry.getValue()).canReuse(otherEntry.getValue())) { + return false; + } + } while (thisIterator.hasNext()); + return true; + } + + @Override + public boolean canReplace(IInformationControlCreator creator) { + if (creator.getClass() != this.getClass()) { + return false; + } + CompositeInformationControlCreator other = (CompositeInformationControlCreator)creator; + if (other.creators.size() != this.creators.size()) { + return false; + } + Iterator<Entry<ITextHover, IInformationControlCreator>> thisIterator = this.creators.entrySet().iterator(); + Iterator<Entry<ITextHover, IInformationControlCreator>> otherIterator = other.creators.entrySet().iterator(); + do { + Entry<ITextHover, IInformationControlCreator> thisEntry = thisIterator.next(); + Entry<ITextHover, IInformationControlCreator> otherEntry = otherIterator.next(); + if (!thisEntry.getKey().equals(otherEntry.getKey())) { + return false; + } + if (!(thisEntry.getValue() instanceof IInformationControlCreatorExtension)) { + return false; + } + if (!((IInformationControlCreatorExtension)thisEntry.getValue()).canReplace(otherEntry.getValue())) { + return false; + } + } while (thisIterator.hasNext()); + return true; + } + + + @Override + public IInformationControl createInformationControl(Shell parent) { + return new CompositeInformationControl(parent, this.creators); + } + +} |