// Path: src/chibipaint/controller/CPCommandId.java
// public enum CPCommandId
// {
//   ZoomIn,
//   ZoomOut,
//   Zoom100,
//   ZoomSpecific,
//   Undo,
//   Redo,
//   ClearHistory,
//   Pencil,
//   Pen,
//   Eraser,
//   SoftEraser,
//   AirBrush,
//   Dodge,
//   Burn,
//   Water,
//   Blur,
//   Smudge,
//   Blender,
//   FloodFill,
//   MagicWand,
//   FreeSelection,
//   FreeTransform,
//   RectSelection,
//   RotateCanvas,
//   FreeHand,
//   Line,
//   Bezier,
//   About,
//   Test,
//   LayerToggleAll,
//   LayerDuplicate,
//   LayerMergeDown,
//   LayerMergeAll,
//   Fill,
//   Clear,
//   SelectAll,
//   AlphaToSelection,
//   InvertSelection,
//   DeselectAll,
//   MNoise,
//   CNoise,
//   FXBoxBlur,
//   FXGaussianBlur,
//   FXInvert,
//   FXMakeGrayscaleByLuma,
//   ApplyToAllLayers,
//   ShowSelection,
//   LinearInterpolation,
//   ShowGrid,
//   GridOptions,
//   ResetCanvasRotation,
//   PalColor,
//   PalBrush,
//   PalLayers,
//   PalStroke,
//   PalSwatches,
//   PalTool,
//   PalMisc,
//   PalTextures,
//   TogglePalettes,
//   Copy,
//   CopyMerged,
//   Paste,
//   Cut,
//   ApplyTransform,
//   CancelTransform,
//   MoveTransform,
//   FlipHorizontally,
//   FlipVertically,
//   Rotate90CCW,
//   Rotate90CW,
//   AddLayer,
//   RemoveLayer,
// 
// // Don't forget to add ids to corresponding functions below
// 
//   // For App only:
//   Export, // Additional in info is extension
//   Import, // Additional in info is extension
//   Exit,
//   Save,
//   New,
//   OpenRecent, // Additional in info is number
// 
//   // For Applet only:
//   Float,
//   Send;
// 
// public boolean isForAppOnly ()
// {
//   switch (this)
//     {
//     case Export:
//     case Import:
//     case Exit:
//     case OpenRecent:
//     case Save:
//     case New:
//       return true;
//     default:
//       return false;
//     }
// }
// 
// public boolean isForAppletOnly ()
// {
//   switch (this)
//     {
//     case Float:
//     case Send:
//       return true;
//     default:
//       return false;
//     }
// }
// 
// public boolean isSpecificToType ()
// {
//   return (this.isForAppletOnly () || this.isForAppOnly ());
// }
// }
// 
// Path: src/chibipaint/controller/CPCommandSettings.java
// public interface CPCommandSettings
// {
// public class FileExtension implements CPCommandSettings
// {
//   public final String extension;
// 
//   public FileExtension (String value)
//   {
//     extension = value;
//   }
// }
// 
// public class RecentFileNumber implements CPCommandSettings
// {
//   public final int number;
// 
//   public RecentFileNumber (int numberArg)
//   {
//     number = numberArg;
//   }
// }
// 
// public class CheckBoxState implements CPCommandSettings
// {
//   public final boolean checked;
// 
//   public CheckBoxState (boolean checkedArg)
//   {
//     checked = checkedArg;
//   }
// }
// 
// public class DirectionSettings implements CPCommandSettings
// {
//   public final CPEnums.Direction direction;
// 
//   public DirectionSettings (CPEnums.Direction directionArg)
//   {
//     direction = directionArg;
//   }
// }
// 
// // This is because icon button rely heavily on this
// // TODO: remove this logic
// public class SourceIconButton implements CPCommandSettings
// {
//   public final CPIconButton button;
// 
//   public SourceIconButton (CPIconButton buttonArg)
//   {
//     button = buttonArg;
//   }
// }
// 
// 
// }
// 
// Path: src/chibipaint/controller/ICPController.java
// public interface ICPController
// {
// abstract public void performCommand (CPCommandId commandId, CPCommandSettings commandSettings);
// }


import chibipaint.controller.CPCommandId;
import chibipaint.controller.CPCommandSettings;
import chibipaint.controller.ICPController;
import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.ArrayList;
  Dimension d = getSize ();
  g.drawImage (icons, border, border, iconW + border, iconH + border, 0, iconIndex * iconH, iconW, (iconIndex + 1)
          * iconH, null);

  if (!this.isEnabled ())
    {
      g.setColor (Color.lightGray);
    }
  else if (mouseOver && !mousePressed)
    {
      g.setColor (Color.orange);
    }
  else if (selected || mousePressed)
    {
      g.setColor (Color.red);
    }
  else
    {
      g.setColor (Color.black);
    }

  g.drawRect (0, 0, d.width - 1, d.height - 1);
}

@Override
public void mouseClicked (MouseEvent e)
{
  if (e.getClickCount () == 2 && doubleClickCommandId != null)
    {
      for (ICPController controller : controllers)
// Path: src/chibipaint/controller/CPCommandId.java
// public enum CPCommandId
// {
//   ZoomIn,
//   ZoomOut,
//   Zoom100,
//   ZoomSpecific,
//   Undo,
//   Redo,
//   ClearHistory,
//   Pencil,
//   Pen,
//   Eraser,
//   SoftEraser,
//   AirBrush,
//   Dodge,
//   Burn,
//   Water,
//   Blur,
//   Smudge,
//   Blender,
//   FloodFill,
//   MagicWand,
//   FreeSelection,
//   FreeTransform,
//   RectSelection,
//   RotateCanvas,
//   FreeHand,
//   Line,
//   Bezier,
//   About,
//   Test,
//   LayerToggleAll,
//   LayerDuplicate,
//   LayerMergeDown,
//   LayerMergeAll,
//   Fill,
//   Clear,
//   SelectAll,
//   AlphaToSelection,
//   InvertSelection,
//   DeselectAll,
//   MNoise,
//   CNoise,
//   FXBoxBlur,
//   FXGaussianBlur,
//   FXInvert,
//   FXMakeGrayscaleByLuma,
//   ApplyToAllLayers,
//   ShowSelection,
//   LinearInterpolation,
//   ShowGrid,
//   GridOptions,
//   ResetCanvasRotation,
//   PalColor,
//   PalBrush,
//   PalLayers,
//   PalStroke,
//   PalSwatches,
//   PalTool,
//   PalMisc,
//   PalTextures,
//   TogglePalettes,
//   Copy,
//   CopyMerged,
//   Paste,
//   Cut,
//   ApplyTransform,
//   CancelTransform,
//   MoveTransform,
//   FlipHorizontally,
//   FlipVertically,
//   Rotate90CCW,
//   Rotate90CW,
//   AddLayer,
//   RemoveLayer,
// 
// // Don't forget to add ids to corresponding functions below
// 
//   // For App only:
//   Export, // Additional in info is extension
//   Import, // Additional in info is extension
//   Exit,
//   Save,
//   New,
//   OpenRecent, // Additional in info is number
// 
//   // For Applet only:
//   Float,
//   Send;
// 
// public boolean isForAppOnly ()
// {
//   switch (this)
//     {
//     case Export:
//     case Import:
//     case Exit:
//     case OpenRecent:
//     case Save:
//     case New:
//       return true;
//     default:
//       return false;
//     }
// }
// 
// public boolean isForAppletOnly ()
// {
//   switch (this)
//     {
//     case Float:
//     case Send:
//       return true;
//     default:
//       return false;
//     }
// }
// 
// public boolean isSpecificToType ()
// {
//   return (this.isForAppletOnly () || this.isForAppOnly ());
// }
// }
// 
// Path: src/chibipaint/controller/CPCommandSettings.java
// public interface CPCommandSettings
// {
// public class FileExtension implements CPCommandSettings
// {
//   public final String extension;
// 
//   public FileExtension (String value)
//   {
//     extension = value;
//   }
// }
// 
// public class RecentFileNumber implements CPCommandSettings
// {
//   public final int number;
// 
//   public RecentFileNumber (int numberArg)
//   {
//     number = numberArg;
//   }
// }
// 
// public class CheckBoxState implements CPCommandSettings
// {
//   public final boolean checked;
// 
//   public CheckBoxState (boolean checkedArg)
//   {
//     checked = checkedArg;
//   }
// }
// 
// public class DirectionSettings implements CPCommandSettings
// {
//   public final CPEnums.Direction direction;
// 
//   public DirectionSettings (CPEnums.Direction directionArg)
//   {
//     direction = directionArg;
//   }
// }
// 
// // This is because icon button rely heavily on this
// // TODO: remove this logic
// public class SourceIconButton implements CPCommandSettings
// {
//   public final CPIconButton button;
// 
//   public SourceIconButton (CPIconButton buttonArg)
//   {
//     button = buttonArg;
//   }
// }
// 
// 
// }
// 
// Path: src/chibipaint/controller/ICPController.java
// public interface ICPController
// {
// abstract public void performCommand (CPCommandId commandId, CPCommandSettings commandSettings);
// }


// Path: src/chibipaint/gui/CPIconButton.java
import chibipaint.controller.CPCommandId;
import chibipaint.controller.CPCommandSettings;
import chibipaint.controller.ICPController;
import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.ArrayList;

  Dimension d = getSize ();
  g.drawImage (icons, border, border, iconW + border, iconH + border, 0, iconIndex * iconH, iconW, (iconIndex + 1)
          * iconH, null);

  if (!this.isEnabled ())
    {
      g.setColor (Color.lightGray);
    }
  else if (mouseOver && !mousePressed)
    {
      g.setColor (Color.orange);
    }
  else if (selected || mousePressed)
    {
      g.setColor (Color.red);
    }
  else
    {
      g.setColor (Color.black);
    }

  g.drawRect (0, 0, d.width - 1, d.height - 1);
}

@Override
public void mouseClicked (MouseEvent e)
{
  if (e.getClickCount () == 2 && doubleClickCommandId != null)
    {
      for (ICPController controller : controllers)
        controller.performCommand (doubleClickCommandId, new CPCommandSettings.SourceIconButton (this));