Android Open Source - geoar-app Check List






From Project

Back to project page geoar-app.

License

The source code is released under:

Apache License

If you think the Android project geoar-app listed in this page is inappropriate, such as containing malicious code/tools or violating the copyright, please email info at java2s dot com, thanks.

Java Source Code

/**
 * Copyright 2012 52North Initiative for Geospatial Open Source Software GmbH
 *// ww w .  j a  v  a 2  s  .  c  om
 * 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.n52.geoar.newdata;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.BitSet;
import java.util.Collection;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

public class CheckList<T> extends ArrayList<T> {

  public interface OnCheckedChangedListener<T> {
    void onCheckedChanged(T item, boolean newState);
  }

  public interface OnItemChangedListener<T> {
    void onItemAdded(T item);

    void onItemRemoved(T item);
  }

  public static abstract class OnItemChangedListenerWrapper<T> implements
      OnItemChangedListener<T> {
    public void onItemAdded(T item) {
      onItemChanged();
    };

    public void onItemRemoved(T item) {
      onItemChanged();
    };

    public void onItemChanged() {
    };
  }

  class Checker {
    private T item;

    private Checker(T item) {
      this.item = item;
    }

    void setChecked(boolean state) {
      checkItem(item, state);
    }

    boolean isChecked() {
      return CheckList.this.isChecked(item);
    }
  }

  @Retention(RetentionPolicy.RUNTIME)
  @Target(ElementType.FIELD)
  public @interface CheckManager {
  }

  @Retention(RetentionPolicy.RUNTIME)
  @Target(ElementType.METHOD)
  public @interface CheckedChangedListener {
  }

  private static final long serialVersionUID = 1L;
  private Method checkedChangedMethod;

  private BitSet checkSet = new BitSet();
  private Set<OnCheckedChangedListener<T>> checkedChangeListeners = new HashSet<OnCheckedChangedListener<T>>();
  private Set<OnItemChangedListener<T>> itemChangeListeners = new HashSet<OnItemChangedListener<T>>();

  private Field checkManagerField;

  public CheckList(Class<?> itemClass) {
    for (Field field : itemClass.getDeclaredFields()) {
      if (field.isAnnotationPresent(CheckManager.class)) {
        field.setAccessible(true);
        checkManagerField = field;
      }
    }
    for (Method method : itemClass.getDeclaredMethods()) {
      if (method.isAnnotationPresent(CheckedChangedListener.class)) {
        method.setAccessible(true);
        checkedChangedMethod = method;
      }
    }
  }

  public CheckList() {

  }

  @SuppressWarnings("unchecked")
  public <E> List<E> ofType(Class<E> clazz) {
    List<E> resultList = new ArrayList<E>();

    for (T item : this) {
      if (clazz.isAssignableFrom(item.getClass())) {
        resultList.add((E) item);
      }
    }

    return resultList;
  }

  public List<T> getCheckedItems() {
    List<T> resultList = new ArrayList<T>();
    for (int i = 0; i < size(); i++) {
      if (checkSet.get(i))
        resultList.add(get(i));
    }
    return resultList;
  }
  

  public List<T> getUncheckedItems() {
    List<T> resultList = new ArrayList<T>();
    for (int i = 0; i < size(); i++) {
      if (!checkSet.get(i))
        resultList.add(get(i));
    }
    return resultList;
  }

  @SuppressWarnings("unchecked")
  public <E> List<E> getCheckedItems(Class<E> clazz) {
    List<E> resultList = new ArrayList<E>();
    for (int i = 0; i < size(); i++) {
      if (checkSet.get(i)) {
        T item = get(i);
        if (clazz.isAssignableFrom(item.getClass())) {
          resultList.add((E) item);
        }
      }
    }
    return resultList;
  }

  public void checkItem(int index, boolean state) {
    boolean changed = checkSet.get(index) != state;
    T item = get(index);
    checkSet.set(index, state);
    if (changed) {
      try {
        if (checkedChangedMethod != null) {
          checkedChangedMethod.invoke(item, state);
        }
      } catch (Exception e) {
        throw new RuntimeException(e);
      }
      notifyCheckedChanged(item, state);  
    }
  }

  @Override
  public void add(int index, T object) {
    injectFields(object);
    super.add(index, object);
    notifyItemAdded(object);
  };

  @Override
  public boolean add(T object) {
    injectFields(object);
    boolean changed = super.add(object);
    notifyItemAdded(object);
    return changed;
  };

  public void add(T object, boolean state) {
    add(object);
    checkItem(object, state);
  }

  private void injectFields(T object) {
    try {
      if (checkManagerField != null) {
        if (checkManagerField.get(object) != null) {
          throw new RuntimeException(
              "This item is already element of a CheckList!");
        }
        checkManagerField.set(object, new Checker(object));
      }
    } catch (Exception e) {
      throw new RuntimeException(e);
    }
  }

  public void checkItem(T item, boolean state) {
    if (contains(item)) {
      checkItem(this.indexOf(item), state);
    }
  }

  public void checkItem(T item) {
    checkItem(item, true);
  }

  private void notifyCheckedChanged(T item, boolean newState) {
    for (OnCheckedChangedListener<T> listener : checkedChangeListeners) {
      listener.onCheckedChanged(item, newState);
    }
  }

  private void notifyItemAdded(T item) {
    for (OnItemChangedListener<T> listener : itemChangeListeners) {
      listener.onItemAdded(item);
    }
  }

  private void notifyItemRemoved(T item) {
    for (OnItemChangedListener<T> listener : itemChangeListeners) {
      listener.onItemRemoved(item);
    }
  }

  public void addOnCheckedChangeListener(OnCheckedChangedListener<T> listener) {
    checkedChangeListeners.add(listener);
  }

  public void removeOnCheckedChangeListener(
      OnCheckedChangedListener<T> listener) {
    checkedChangeListeners.remove(listener);
  }

  public void addOnItemChangeListener(OnItemChangedListener<T> listener) {
    itemChangeListeners.add(listener);
  }

  public void removeOnItemChangeListener(OnItemChangedListener<T> listener) {
    itemChangeListeners.remove(listener);
  }

  public boolean isChecked(T item) {
    int index = indexOf(item);
    return isChecked(index);
  }

  public boolean isChecked(int index) {
    if (index >= 0) {
      return checkSet.get(index);
    } else {
      return false;
    }
  }

  @Override
  public T remove(int index) {
    for (int i = index, len = size() - 1; i < len; i++) {
      checkSet.set(index, checkSet.get(i + 1));
    }
    checkSet.set(size() - 1, false);
    T item = super.remove(index);
    try {
      if (checkManagerField != null) {
        checkManagerField.set(item, null);
      }
    } catch (Exception e) {
      throw new RuntimeException(e);
    }
    notifyItemRemoved(item);
    return item;
  }

  @Override
  public boolean remove(Object object) {
    int index = indexOf(object);
    if (index >= 0) {
      return remove(index) != null;
    } else {
      return false;
    }
  }

  @Override
  public boolean removeAll(Collection<?> collection) {
    throw new UnsupportedOperationException();
  }

  @Override
  public void clear() {
    checkSet.clear();
    super.clear();
    notifyItemRemoved(null);
  }

  public void checkAll(boolean state) {
    for (int i = 0, len = size(); i < len; i++) {
      checkItem(i, state);
    }
  }

  public boolean hasChecked() {
    return checkSet.cardinality() > 0;
  }
  
  public boolean allChecked() {
    return checkSet.cardinality() == size();
  }
}




Java Source Code List

.DataSourcesOverlay.java
.VisualizationOverlayItem.java
org.n52.geoar.AboutDialog.java
org.n52.geoar.DataSourceListAdapter.java
org.n52.geoar.GeoARActivity.java
org.n52.geoar.GeoARApplication.java
org.n52.geoar.ar.view.ARFragment.java
org.n52.geoar.ar.view.ARObject.java
org.n52.geoar.ar.view.ARView.java
org.n52.geoar.ar.view.DataSourceVisualizationHandler.java
org.n52.geoar.ar.view.IntroController.java
org.n52.geoar.ar.view.IntroViewer.java
org.n52.geoar.ar.view.gl.ARSurfaceViewRenderer.java
org.n52.geoar.ar.view.gl.ARSurfaceView.java
org.n52.geoar.ar.view.gl.GLESCamera.java
org.n52.geoar.ar.view.gl.MultisampleConfigs.java
org.n52.geoar.ar.view.gl.SurfaceTopology.java
org.n52.geoar.ar.view.overlay.ARCanvasSurfaceView.java
org.n52.geoar.ar.view.overlay.GUIDrawable.java
org.n52.geoar.ar.view.overlay.Radar.java
org.n52.geoar.exception.UnsupportedGeometryType.java
org.n52.geoar.map.view.DataSourceOverlayHandler.java
org.n52.geoar.map.view.GeoARMapView.java
org.n52.geoar.map.view.MapActivityContext.java
org.n52.geoar.map.view.MapFragment.java
org.n52.geoar.map.view.overlay.DataSourceOverlay.java
org.n52.geoar.map.view.overlay.DataSourcePointOverlay.java
org.n52.geoar.map.view.overlay.DataSourcePolygonOverlay.java
org.n52.geoar.map.view.overlay.DataSourcePolylineOverlay.java
org.n52.geoar.map.view.overlay.DataSourcesOverlay.java
org.n52.geoar.map.view.overlay.OverlayType.java
org.n52.geoar.map.view.overlay.PointOverlayType.java
org.n52.geoar.map.view.overlay.PolygonOverlayType.java
org.n52.geoar.map.view.overlay.PolylineOverlayType.java
org.n52.geoar.newdata.CheckList.java
org.n52.geoar.newdata.DataCache.java
org.n52.geoar.newdata.DataSourceHolder.java
org.n52.geoar.newdata.DataSourceInstanceHolder.java
org.n52.geoar.newdata.DataSourceInstanceSettingsDialogActivity.java
org.n52.geoar.newdata.InstalledPluginHolder.java
org.n52.geoar.newdata.PluginActivityContext.java
org.n52.geoar.newdata.PluginContext.java
org.n52.geoar.newdata.PluginDialogFragment.java
org.n52.geoar.newdata.PluginDownloadHolder.java
org.n52.geoar.newdata.PluginDownloader.java
org.n52.geoar.newdata.PluginFragment.java
org.n52.geoar.newdata.PluginGridAdapter.java
org.n52.geoar.newdata.PluginHolder.java
org.n52.geoar.newdata.PluginLoader.java
org.n52.geoar.newdata.PluginLogger.java
org.n52.geoar.newdata.PluginStateInputStream.java
org.n52.geoar.newdata.Tile.java
org.n52.geoar.settings.DateTimeSettingsViewField.java
org.n52.geoar.settings.DateUtils.java
org.n52.geoar.settings.NumberSettingsViewField.java
org.n52.geoar.settings.SettingsException.java
org.n52.geoar.settings.SettingsHelper.java
org.n52.geoar.settings.SettingsViewField.java
org.n52.geoar.settings.SettingsView.java
org.n52.geoar.settings.SpinnerSettingsViewField.java
org.n52.geoar.settings.StringSettingsViewField.java
org.n52.geoar.tracking.camera.CameraView.java
org.n52.geoar.tracking.camera.RealityCamera.java
org.n52.geoar.tracking.location.AdaptiveLowPassSensorBuffer.java
org.n52.geoar.tracking.location.LocationHandler.java
org.n52.geoar.tracking.location.LowPassSensorBuffer.java
org.n52.geoar.tracking.location.MeanSensorBuffer.java
org.n52.geoar.tracking.location.SensorBuffer.java
org.n52.geoar.view.InfoView.java
org.n52.geoar.view.geoar.CalibrationControlView.java
org.n52.geoar.view.geoar.Settings.java
org.n52.geoar.view.geoar.gl.mode.BilligerColorShader.java
org.n52.geoar.view.geoar.gl.mode.BilligerLightShader.java
org.n52.geoar.view.geoar.gl.mode.BilligerTextureShader.java
org.n52.geoar.view.geoar.gl.mode.BoundingBox.java
org.n52.geoar.view.geoar.gl.mode.FeatureShader.java
org.n52.geoar.view.geoar.gl.mode.PhongFeatureShader.java
org.n52.geoar.view.geoar.gl.mode.RenderFeature2.java
org.n52.geoar.view.geoar.gl.mode.Spatial.java
org.n52.geoar.view.geoar.gl.mode.TextureFeatureShader.java
org.n52.geoar.view.geoar.gl.mode.Texture.java
org.n52.geoar.view.geoar.gl.mode.features.CubeFeature2.java
org.n52.geoar.view.geoar.gl.mode.features.FlatCircleFeature.java
org.n52.geoar.view.geoar.gl.mode.features.HeightMapFeature.java
org.n52.geoar.view.geoar.gl.mode.features.NewGridFeature.java
org.n52.geoar.view.geoar.gl.mode.features.ReferencedGridFeature.java
org.n52.geoar.view.geoar.gl.mode.features.SphereFeature.java
org.n52.geoar.view.geoar.gl.mode.features.TriangleFeature.java