@Override
  public boolean onContextItemSelected(MenuItem item) {
    FFXICharacter charInfo = getFFXICharacter();
    BlueMagicSetView ms;

    ms = (BlueMagicSetView) findViewById(R.id.Magics);
    switch (item.getItemId()) {
      case R.id.Set:
        charInfo.setBlueMagic(ms.getItemId(mLongClickingItemPosition), true);
        updateValues();
        return true;
      case R.id.Remove:
        charInfo.setBlueMagic(ms.getItemId(mLongClickingItemPosition), false);
        updateValues();
        return true;
      case R.id.RemoveAll:
        while (charInfo.getNumBlueMagic() > 0) {
          charInfo.setBlueMagic(charInfo.getBlueMagic(0).getId(), false);
        }
        updateValues();
        return true;
    }

    return super.onContextItemSelected(item);
  }
  @Override
  public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
    super.onCreateContextMenu(menu, v, menuInfo);

    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.bluemagicset_context, menu);
    BlueMagicSetView ms;
    boolean set;

    ms = (BlueMagicSetView) findViewById(R.id.Magics);
    set = getFFXICharacter().isBlueMagicSet(ms.getItemId(mLongClickingItemPosition));
    MenuItem item;

    item = menu.findItem(R.id.Remove);
    if (item != null) item.setEnabled(set);
    item = menu.findItem(R.id.Set);
    if (item != null) item.setEnabled(!set);
  }
  public void updateValues() {
    FFXICharacter charInfo = getFFXICharacter();

    if (mUpdating) return;
    mUpdating = true;

    BlueMagicSetView ms;

    ms = (BlueMagicSetView) findViewById(R.id.Magics);
    if (ms != null) {
      ms.bindFFXICharacter(charInfo);
    }

    BlueMagicSelectionStatusView bmss;

    bmss = (BlueMagicSelectionStatusView) findViewById(R.id.StatusView);
    if (bmss != null) {
      bmss.bindFFXICharacter(charInfo);
    }
    mUpdating = false;
  }
  @Override
  public void onStart() {
    super.onStart();

    FFXICharacter charInfo = getFFXICharacter();

    // setup controls
    {
      BlueMagicSetView ms;

      ms = (BlueMagicSetView) findViewById(R.id.Magics);
      if (ms != null) {
        ms.bindFFXICharacter(charInfo);
        ms.setOnItemClickListener(
            new OnItemClickListener() {
              public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {}
            });
        ms.setOnItemLongClickListener(
            new OnItemLongClickListener() {

              public boolean onItemLongClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
                mLongClickingItemPosition = arg2;
                openContextMenu(arg0);
                return true;
              }
            });
        registerForContextMenu(ms);
      }
    }

    {
      BlueMagicSelectionStatusView bmss;

      bmss = (BlueMagicSelectionStatusView) findViewById(R.id.StatusView);
      if (bmss != null) {
        bmss.bindFFXICharacter(charInfo);
      }
    }
  }