X-Git-Url: https://gerrit.simantics.org/r/gitweb?a=blobdiff_plain;f=bundles%2Forg.simantics.utils.datastructures%2Fsrc%2Forg%2Fsimantics%2Futils%2Fdatastructures%2Fhints%2FIHintContext.java;fp=bundles%2Forg.simantics.utils.datastructures%2Fsrc%2Forg%2Fsimantics%2Futils%2Fdatastructures%2Fhints%2FIHintContext.java;h=8391c55d53a482f45153ced6aa782d61ec3545b3;hb=969bd23cab98a79ca9101af33334000879fb60c5;hp=0000000000000000000000000000000000000000;hpb=866dba5cd5a3929bbeae85991796acb212338a08;p=simantics%2Fplatform.git diff --git a/bundles/org.simantics.utils.datastructures/src/org/simantics/utils/datastructures/hints/IHintContext.java b/bundles/org.simantics.utils.datastructures/src/org/simantics/utils/datastructures/hints/IHintContext.java new file mode 100644 index 000000000..8391c55d5 --- /dev/null +++ b/bundles/org.simantics.utils.datastructures/src/org/simantics/utils/datastructures/hints/IHintContext.java @@ -0,0 +1,201 @@ +/******************************************************************************* + * Copyright (c) 2007, 2010 Association for Decentralized Information Management + * in Industry THTH ry. + * 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: + * VTT Technical Research Centre of Finland - initial API and implementation + *******************************************************************************/ +/* + * + * @author Toni Kalajainen + */ +package org.simantics.utils.datastructures.hints; + +import java.util.Map; + +/** + * Hint context interface + * + * @see Key + * @see HintContext + * @see HintStack + * @see IHintObservable + */ +public interface IHintContext extends IHintObservable { + + /** + * Set a value for a hint. + * @param key key + * @param value the value, null is not accepted + */ + void setHint(Key key, Object value); + + /** + * Set a set of hints + * @param hints + */ + void setHints(Map hints); + + /** + * Remove a hint. In stack hint implementation lower priority hint will + * become effective. + + * @param type of the object bound to the specified key + * @param key key to use for the hint + * @return the typed object currently bound to the specified key + */ + E removeHint(Key key); + + /** + * Clears the context of all current hints without notifying any listeners. + */ + void clearWithoutNotification(); + + /** + * Hint key + */ + public static abstract class Key { + /** + * Test if value is accepted + * @param value the value + * @return true if value is accepted, false if not + */ + public abstract boolean isValueAccepted(Object value); + } + + /** + * Mouse id specific key. With this key there is unique value for each mouse id. + */ + public static abstract class MouseSpecificKey extends Key { + private final int mouseId; + public MouseSpecificKey(int mouseId) + { + this.mouseId = mouseId; + } + public int getMouseId() + { + return mouseId; + } + @Override + public int hashCode() { + return super.hashCode() ^ mouseId; + } + @Override + public boolean equals(Object obj) { + if (!(obj instanceof MouseSpecificKey)) return false; + if (((MouseSpecificKey)obj).mouseId != mouseId) return false; + if (!obj.getClass().equals(getClass())) return false; + return true; + } + } + + /** + * Key whose value is of a specific given class. + */ + public static class KeyOf extends Key { + final Class clazz; + final String keyName; + public KeyOf(Class clazz) + { + this.clazz = clazz; + this.keyName = null; + } + public KeyOf(Class clazz, String keyName) + { + this.clazz = clazz; + this.keyName = keyName; + } + @Override + public boolean isValueAccepted(Object value) { + return clazz.isInstance(value); + } + @Override + public String toString() { + if (keyName == null) + return "Key Of "+clazz.getName(); + return keyName + "(" + clazz.getSimpleName() + ")"; + } + } + + /** + * String based key + */ + public static abstract class StringKey extends Key { + protected final String str; + protected int hash; + public StringKey(String str) + { + this.str = str; + hash = getClass().hashCode() ^str.hashCode(); + } + public String getString() + { + return str; + } + @Override + public int hashCode() { + return hash; + } + @Override + public boolean equals(Object obj) { + if (!(obj instanceof StringKey)) return false; + if (!((StringKey)obj).str.equals(str)) return false; + if (obj.getClass()!=getClass()) return false; + return true; + } + } + + /** + * String based key whose value is of a specific class. + */ + public static class StringKeyOf extends StringKey { + final Class clazz; + public StringKeyOf(String str, Class clazz) + { + super(str); + this.clazz = clazz; + } + @Override + public boolean isValueAccepted(Object value) { + return clazz.isInstance(value); + } + @Override + public String toString() { + return "Key Of ("+clazz.getName()+", "+str+")"; + } + } + + + public static class MouseSpecificKeyOf extends MouseSpecificKey { + public final Class clazz; + public final int mouseId; + final int hash; + public MouseSpecificKeyOf(int mouseId, Class clazz) + { + super(mouseId); + this.clazz = clazz; + this.mouseId = mouseId; + hash = getClass().hashCode() ^ mouseId ^ 24392439; + } + @Override + public boolean isValueAccepted(Object value) { + return clazz.isInstance(value); + } + @Override + public int hashCode() { + return hash; + } + @Override + public boolean equals(Object obj) { + if (obj.getClass()!=this.getClass()) return false; + MouseSpecificKeyOf other = (MouseSpecificKeyOf) obj; + return other.mouseId == mouseId; + } + } + + +}