/**
   * パーツの色ダイアログが変更されたことにより、同一の他のカラーグループのレイヤーのカラーダイアログの設定値をコピーする.<br>
   * (色ダイアログのパラメータ変更により呼び出される.)<br>
   *
   * @param partsCategory パーツカテゴリ
   * @param eventSourceLayer 変更もとのレイヤー
   * @param sourceColorDialog 変更されたカラーダイアログ
   */
  public void syncColorGroup(
      PartsCategory partsCategory, Layer eventSourceLayer, ColorDialog sourceColorDialog) {
    if (partsCategory == null || sourceColorDialog == null) {
      throw new IllegalArgumentException();
    }

    // 変更もと
    ArrayList<Layer> syncSources = new ArrayList<Layer>();
    if (eventSourceLayer != null) {
      if (sourceColorDialog.isSyncColorGroup(eventSourceLayer)) {
        syncSources.add(eventSourceLayer);
      }
    } else {
      for (Layer layer2 : partsCategory.getLayers()) {
        if (sourceColorDialog.isSyncColorGroup(layer2)) {
          syncSources.add(layer2);
        }
      }
    }

    // 変更もとのレイヤーのカラーグループを他のレイヤーにも適用する.
    for (Layer sourceLayer : syncSources) {
      ColorGroup sourceColorGroup = sourceColorDialog.getColorGroup(sourceLayer);
      if (sourceColorGroup != null && sourceColorGroup.isEnabled()) {
        ColorConvertParameter param = sourceColorDialog.getColorConvertParameter(sourceLayer);

        // 他のパネルに適用する
        for (ColorDialog targetColorDialog : colorDialogs) {
          for (Layer targetLayer : targetColorDialog.getPartsCategory().getLayers()) {
            if (!targetLayer.equals(sourceLayer)) {
              if (ColorGroup.equals(
                  targetColorDialog.getColorGroup(targetLayer), sourceColorGroup)) {
                if (targetColorDialog.isSyncColorGroup(targetLayer)) {
                  targetColorDialog.setColorConvertParameter(targetLayer, param);
                }
              }
            }
          }
        }
        // 色ダイアログで選択中でない有効なパーツも含めてパーツカラーを更新する.
        for (PartsCategory targetPartsCategory : partsSelectionMrg.getAllCategories()) {
          Collection<PartsIdentifier> selectedPartss =
              partsSelectionMrg.getSelectedPartsIdentifiers(targetPartsCategory);
          for (PartsIdentifier partsIdentifier : selectedPartss) {
            // カラーダイアログで選択されていない他のパーツも含めてパーツカラーを更新する.
            PartsColorInfo partsColorInfo = partsColorMrg.getPartsColorInfo(partsIdentifier, true);
            for (Map.Entry<Layer, ColorInfo> entry : partsColorInfo.entrySet()) {
              ColorInfo colorInfo = entry.getValue();
              if (ColorGroup.equals(sourceColorGroup, colorInfo.getColorGroup())) {
                if (colorInfo.isSyncColorGroup()) {
                  colorInfo.setColorParameter(param);
                }
              }
            }
          }
        }
      }
    }
  }
 protected void onChangeColorGroup(
     ColorDialog destColorDialog, Layer layer, ColorGroup colorGroup) {
   if (destColorDialog == null || layer == null || colorGroup == null) {
     throw new IllegalArgumentException();
   }
   for (ColorDialog colorDlg : colorDialogs) {
     for (Layer srcLayer : colorDlg.getPartsCategory().getLayers()) {
       if (!srcLayer.equals(layer)) {
         if (ColorGroup.equals(colorGroup, colorDlg.getColorGroup(srcLayer))
             && colorDlg.isSyncColorGroup(srcLayer)) {
           ColorConvertParameter param = colorDlg.getColorConvertParameter(srcLayer);
           destColorDialog.setColorConvertParameter(layer, param);
           break;
         }
       }
     }
   }
 }