home *** CD-ROM | disk | FTP | other *** search
/ Chip 5 / Chip_05_2000.iso / Listings / PROG.txt
Encoding:
Text File  |  2000-02-15  |  15.4 KB  |  596 lines

  1.  
  2. public interface DrawConstants
  3. {
  4.   public static final String PENCIL = "Pencil";
  5.   public static final String ERASER = "Eraser";
  6.   public static final String PAINT = "Paint";
  7.   public static final String DROPPER = "Dropper";
  8.   public static final String HAND = "Hand";
  9.   public static final String LINE = "Line";
  10.   public static final String OVAL = "Oval";
  11.   public static final String RECT = "Rect";
  12.   public static final String ROUND_RECT = "RoundRect";
  13.   public static final String FILL_OVAL = "FillOval";
  14.   public static final String FILL_RECT = "FillRect";
  15.   public static final String FILL_ROUND_RECT = "FillRoundRect";
  16.   public static final String CUT = "Cut";
  17.   public static final String COPY = "Copy";
  18.   public static final String PASTE = "Paste";
  19. }
  20.  
  21.  
  22. import java.awt.*;
  23. import java.awt.event.*;
  24. import java.util.*;
  25. import javax.swing.*;
  26. import javax.swing.border.*;
  27.  
  28. public class DrawToolbar extends ToolPanel
  29.   implements DrawConstants, ActionListener
  30. {
  31.   protected ArrayList listeners = new ArrayList();
  32.   protected Cursor cursor;
  33.   
  34.   protected DrawButton[] buttons =
  35.   {
  36.   //  new DrawButton(CUT, new Point(2, 2)),
  37.   //  new DrawButton(COPY, new Point(2, 2)),
  38.   //  new DrawButton(PASTE, new Point(2, 2)),
  39.     
  40.     new DrawButton(PENCIL, new Point(4, 15)),
  41.     new DrawButton(DROPPER, new Point(0, 15)),
  42.     new DrawButton(PAINT, new Point(13, 14)),
  43.  
  44.     new DrawButton(ERASER, new Point(1, 13)),
  45.     new DrawButton(HAND, new Point(8, 8)),
  46.     new DrawButton(LINE, new Point(2, 2)),
  47.     
  48.     new DrawButton(OVAL, new Point(2, 2)),
  49.     new DrawButton(RECT, new Point(2, 2)),
  50.     new DrawButton(ROUND_RECT, new Point(2, 2)),
  51.  
  52.     new DrawButton(FILL_OVAL, new Point(2, 2)),
  53.     new DrawButton(FILL_RECT, new Point(2, 2)),
  54.     new DrawButton(FILL_ROUND_RECT, new Point(2, 2))
  55.   };
  56.   
  57.   public DrawToolbar()
  58.   {
  59.     setBorder(new CompoundBorder(
  60.       new EtchedBorder(),
  61.       new EmptyBorder(4, 4, 4, 4)));
  62.     setLayout(new GridLayout(4, 3, 2, 2));
  63.     ButtonGroup group = new ButtonGroup();
  64.     for (int i = 0; i < buttons.length; i++)
  65.     {
  66.       add(buttons[i]);
  67.       group.add(buttons[i]);
  68.       buttons[i].addActionListener(this);
  69.     }
  70.   }
  71.  
  72.   public void actionPerformed(ActionEvent event)
  73.   {
  74.     DrawButton button = (DrawButton)event.getSource();
  75.     cursor = button.getToolCursor();
  76.     fireActionEvent(button.getCommand());
  77.   }
  78.   
  79.   public Cursor getToolCursor()
  80.   {
  81.     return cursor;
  82.   }
  83. }
  84.  
  85.  
  86. import java.io.File;
  87. import javax.swing.filechooser.*;
  88.  
  89. public class GIFFileFilter extends FileFilter
  90. {
  91.   public boolean accept(File file)
  92.   {
  93.     return file.toString().toLowerCase().endsWith(".gif");
  94.   }
  95.   
  96.   public String getDescription()
  97.   {
  98.     return "GIF File";
  99.   }
  100. }
  101.  
  102.  
  103.  
  104. import java.awt.*;
  105. import java.awt.image.*;
  106. import javax.swing.*;
  107.  
  108. public class ImageOps implements SwingConstants
  109. {
  110.   protected BufferedImage moveImage(
  111.     BufferedImage image, int x, int y)
  112.   {
  113.     int w = image.getWidth();
  114.     int h = image.getHeight();
  115.     BufferedImage buffer = new BufferedImage(
  116.       w, h, BufferedImage.TYPE_INT_ARGB);
  117.     Graphics gc = buffer.getGraphics();
  118.     gc.drawImage(image, 0, 0, null);
  119.     image = new BufferedImage(
  120.       w, h, BufferedImage.TYPE_INT_ARGB);
  121.     Graphics g = image.getGraphics();
  122.     g.drawImage(buffer, x, y, null);
  123.     return image;
  124.   }
  125.   
  126.   protected BufferedImage flipImage(
  127.     BufferedImage image, int direction)
  128.   {
  129.     int w = image.getWidth();
  130.     int h = image.getHeight();
  131.     BufferedImage buffer = new BufferedImage(
  132.       w, h, BufferedImage.TYPE_INT_ARGB);
  133.     Graphics gc = buffer.getGraphics();
  134.     if (direction == HORIZONTAL)
  135.       gc.drawImage(image, w, 0, 0, h, 0, 0, w, h, null);
  136.     else
  137.       gc.drawImage(image, 0, h, w, 0, 0, 0, w, h, null);
  138.     image = new BufferedImage(
  139.       w, h, BufferedImage.TYPE_INT_ARGB);
  140.     Graphics g = image.getGraphics();
  141.     g.drawImage(buffer, 0, 0, null);
  142.     return image;
  143.   }
  144.  
  145.   protected BufferedImage rotateImage(
  146.     BufferedImage image, int direction)
  147.   {
  148.     int w = image.getWidth();
  149.     int h = image.getHeight();
  150.     BufferedImage buffer = new BufferedImage(
  151.       w, h, BufferedImage.TYPE_INT_ARGB);
  152.     Graphics2D gc = (Graphics2D)buffer.getGraphics();
  153.     if (direction == RIGHT)
  154.     {
  155.       gc.translate(w, 0);
  156.       gc.rotate(Math.PI / 2);
  157.     }
  158.     if (direction == LEFT)
  159.     {
  160.       gc.translate(0, h);
  161.       gc.rotate(-(Math.PI / 2));
  162.     }
  163.     gc.drawImage(image, 0, 0, null);
  164.     
  165.     image = new BufferedImage(
  166.       w, h, BufferedImage.TYPE_INT_ARGB);
  167.     Graphics g = image.getGraphics();
  168.     g.drawImage(buffer, 0, 0, null);
  169.     return image;
  170.   }
  171.  
  172.   protected void floodFill(BufferedImage buffer,
  173.     int x, int y, int oldColor, int newColor)
  174.   {
  175.     int w = buffer.getWidth();
  176.     int h = buffer.getHeight();
  177.     if (y < 0 || y >= h) return;
  178.     if (x < 0 || x >= w) return;
  179.     int pos = x;
  180.     while (buffer.getRGB(pos, y) == oldColor)
  181.     {
  182.       buffer.setRGB(pos, y, newColor);
  183.       if (y > 0 && buffer.getRGB(pos, y - 1) == oldColor)
  184.         floodFill(buffer, pos, y - 1, oldColor, newColor);
  185.       if ((y + 1) < h && buffer.getRGB(pos, y + 1) == oldColor)
  186.         floodFill(buffer, pos, y + 1, oldColor, newColor);
  187.       pos--;
  188.       if (pos < 0) break;
  189.     }
  190.     pos = x + 1;
  191.     if (pos >= w) return;
  192.     while (buffer.getRGB(pos, y) == oldColor)
  193.     {
  194.       buffer.setRGB(pos, y, newColor);
  195.       if (y > 0 && buffer.getRGB(pos, y - 1) == oldColor)
  196.         floodFill(buffer, pos, y - 1, oldColor, newColor);
  197.       if ((y + 1) < h && buffer.getRGB(pos, y + 1) == oldColor)
  198.         floodFill(buffer, pos, y + 1, oldColor, newColor);
  199.       pos++;
  200.       if (pos >= w) break;
  201.     }
  202.   }
  203. }
  204.  
  205.  
  206. import java.awt.*;
  207. import java.awt.event.*;
  208. import java.awt.image.*;
  209. import javax.swing.*;
  210. import javax.swing.border.*;
  211.  
  212. public class JIconEditor extends JPanel
  213. {
  214.   public JIconEditor()
  215.   {
  216.     BufferedImage image = readBufferedImage("icons/Computer.gif");
  217.     
  218.     setLayout(new BorderLayout());
  219.     
  220.     JPanel west = new JPanel(new BorderLayout());
  221.     JPanel east = new JPanel(new BorderLayout());
  222.     
  223.     ToolPanel action = new ActionToolbar();
  224.     ToolPanel draw = new DrawToolbar();
  225.     JPanel westPanel = new JPanel(new BorderLayout());
  226.     westPanel.add(BorderLayout.NORTH, action);
  227.     westPanel.add(BorderLayout.SOUTH, draw);
  228.  
  229.     west.add(BorderLayout.NORTH, westPanel);
  230.     add(BorderLayout.WEST, west);
  231.  
  232.     JLabel preview = new JLabel(new ImageIcon(image));
  233.     preview.setPreferredSize(new Dimension(26, 26));
  234.     preview.setBorder(BorderFactory.createEtchedBorder());
  235.     
  236.     ToolPanel palette = new PaletteToolbar();
  237.     
  238.     JPanel eastPanel = new JPanel(new BorderLayout());
  239.     eastPanel.add(BorderLayout.NORTH, preview);
  240.     eastPanel.add(BorderLayout.SOUTH, palette);
  241.  
  242.     east.add(BorderLayout.NORTH, eastPanel);
  243.     add(BorderLayout.EAST, east);
  244.  
  245.     PixelEditor editor = new PixelEditor(image, 16, preview);
  246.     add(BorderLayout.CENTER, new JScrollPane(editor));
  247.  
  248.     palette.addActionListener(editor);
  249.     draw.addActionListener(editor);
  250.     action.addActionListener(editor);
  251.   }
  252.   
  253.   public BufferedImage readBufferedImage(String filename)
  254.   {
  255.     ImageIcon icon = new ImageIcon(filename);
  256.     Image image = icon.getImage();
  257.     BufferedImage buffer = new BufferedImage(
  258.       image.getWidth(null), image.getHeight(null),
  259.       BufferedImage.TYPE_INT_ARGB);
  260.     Graphics g = buffer.getGraphics();
  261.     g.drawImage(image, 0, 0, null);
  262.     return buffer;
  263.   }
  264. }
  265.  
  266.  
  267. import java.awt.*;
  268. import javax.swing.*;
  269.  
  270. public class JIconEditorTest
  271. {
  272.   public static void main(String[] args)
  273.   {
  274.     PLAF.setNativeLookAndFeel(true);
  275.     
  276.     JFrame frame = new JFrame("JIconEditor Test");
  277.     frame.getContentPane().add(
  278.       BorderLayout.CENTER, new JIconEditor());
  279.     frame.pack();
  280.     frame.show();
  281.   }
  282. }
  283.  
  284.  
  285.  
  286. import java.awt.*;
  287. import java.awt.image.*;
  288. import javax.swing.*;
  289.  
  290. public class PaletteButton extends JToggleButton
  291. {
  292.   protected Color color;
  293.  
  294.   public PaletteButton(Color color)
  295.   {
  296.     setPreferredSize(new Dimension(22, 22));
  297.     setMaximumSize(new Dimension(22, 22));
  298.     this.color = color;
  299.     BufferedImage image = new BufferedImage(
  300.       16, 16, BufferedImage.TYPE_INT_RGB);
  301.     Graphics g = image.getGraphics();
  302.     g.setColor(color);
  303.     g.fillRect(0, 0, 16, 16);
  304.     setIcon(new ImageIcon(image));
  305.     setFocusPainted(false);
  306.     setHorizontalAlignment(CENTER);
  307.     setVerticalAlignment(CENTER);
  308.   }
  309.   
  310.   public boolean isFocusTraversable()
  311.   {
  312.     return false;
  313.   }
  314.   
  315.   public boolean isDefaultButton()
  316.   {
  317.     return false;
  318.   }
  319.   
  320.   public Color getColor()
  321.   {
  322.     return color;
  323.   }
  324. }
  325.  
  326.  
  327. import java.awt.*;
  328. import java.awt.event.*;
  329. import java.util.*;
  330. import javax.swing.*;
  331. import javax.swing.border.*;
  332.  
  333. public class PaletteToolbar extends ToolPanel
  334.   implements ActionListener
  335. {
  336.   protected Color color;
  337.   protected ArrayList listeners = new ArrayList();
  338.   
  339.   private PaletteButton[] buttons =
  340.   {
  341.     new PaletteButton(Color.red),
  342.     new PaletteButton(Color.cyan),
  343.     new PaletteButton(Color.black),
  344.     new PaletteButton(Color.orange),
  345.     new PaletteButton(Color.green),
  346.     new PaletteButton(Color.magenta),
  347.     new PaletteButton(Color.gray),
  348.     new PaletteButton(Color.pink),
  349.     new PaletteButton(Color.blue),
  350.     new PaletteButton(Color.yellow),
  351.     new PaletteButton(Color.white),
  352.     new PaletteButton(Color.lightGray)
  353.   };
  354.     
  355.   public PaletteToolbar()
  356.   {
  357.     setBorder(new CompoundBorder(
  358.       new EtchedBorder(),
  359.       new EmptyBorder(4, 4, 4, 4)));
  360.     setLayout(new GridLayout(4, 3, 2, 2));
  361.     ButtonGroup group = new ButtonGroup();
  362.     for (int i = 0; i < buttons.length; i++)
  363.     {
  364.       add(buttons[i]);
  365.       group.add(buttons[i]);
  366.       buttons[i].addActionListener(this);
  367.     }
  368.   }
  369.  
  370.   public void actionPerformed(ActionEvent event)
  371.   {
  372.     PaletteButton button = (PaletteButton)event.getSource();
  373.     color = button.getColor();
  374.     fireActionEvent("Select");
  375.   }
  376.   
  377.   public Color getColor()
  378.   {
  379.     return color;
  380.   }
  381. }
  382.  
  383.  
  384. import java.awt.*;
  385. import java.awt.image.*;
  386. import javax.swing.*;
  387.  
  388. public class PixelView extends JPanel
  389. {
  390.   protected int cellSize;
  391.   protected BufferedImage image;
  392.  
  393.   public PixelView(BufferedImage image, int cellSize)
  394.   {
  395.     this.image = image;
  396.     this.cellSize = cellSize;
  397.   }
  398.   
  399.   public Dimension getPreferredSize()
  400.   {
  401.     Insets insets = getInsets();
  402.     int width = image.getWidth();
  403.     int height = image.getHeight();
  404.     return new Dimension(
  405.       insets.left + insets.right + width * cellSize + 1,
  406.       insets.top + insets.bottom + height * cellSize + 1);
  407.   }
  408.  
  409.   public void paintComponent(Graphics g)
  410.   {
  411.     int w = getSize().width;
  412.     int h = getSize().height;
  413.     g.setColor(getBackground());
  414.     g.fillRect(0, 0, w, h);
  415.  
  416.     Insets insets = getInsets();
  417.     int width = image.getWidth();
  418.     int height = image.getHeight();
  419.     
  420.     // Draw grid
  421.     g.setColor(Color.lightGray);
  422.     for (int x = 0; x <= width; x++)
  423.     {
  424.       int offset = insets.left + x * cellSize;
  425.       g.drawLine(offset, insets.top,
  426.         offset, insets.top + height * cellSize);
  427.     }
  428.     for (int y = 0; y <= height; y++)
  429.     {
  430.       int offset = insets.top + y * cellSize;
  431.       g.drawLine(insets.left, offset,
  432.         insets.left + width * cellSize, offset);
  433.     }
  434.     // Draw cells
  435.     for (int x = 0; x < width; x++)
  436.     {
  437.       for (int y = 0; y < height; y++)
  438.       {
  439.         drawCell(g, insets, x, y, image.getRGB(x, y));
  440.       }
  441.     }
  442.   }
  443.   
  444.   protected void drawCell(Graphics g,
  445.     Insets insets, int x, int y, int rgb)
  446.   {
  447.     int alpha = (rgb >> 24) & 0xff;
  448.     if (alpha == 0)
  449.     {
  450.       g.setColor(getBackground());
  451.       g.fillRect(
  452.         insets.left + x * cellSize + 1,
  453.         insets.top + y * cellSize + 1,
  454.         cellSize - 1, cellSize - 1);
  455.       g.setColor(Color.black);
  456.       g.drawLine(
  457.         insets.left + x * cellSize + (cellSize / 2),
  458.         insets.top + y * cellSize + (cellSize / 2),
  459.         insets.left + x * cellSize + (cellSize / 2),
  460.         insets.top + y * cellSize + (cellSize / 2));
  461.     }
  462.     else
  463.     {
  464.       g.setColor(new Color(rgb));
  465.       g.fillRect(
  466.         insets.left + x * cellSize + 1,
  467.         insets.top + y * cellSize + 1,
  468.         cellSize - 1, cellSize - 1);
  469.     }
  470.   }
  471. }
  472.  
  473. import javax.swing.*;
  474.  
  475. public class PLAF
  476. {
  477.   public static void setNativeLookAndFeel(boolean nativeLAF)
  478.   {
  479.     try
  480.     {
  481.       String plaf;
  482.       if (nativeLAF)
  483.       {
  484.         plaf = UIManager.getSystemLookAndFeelClassName();
  485.       }
  486.       else
  487.       {
  488.         plaf = UIManager.getCrossPlatformLookAndFeelClassName();
  489.       }
  490.       UIManager.setLookAndFeel(plaf);
  491.     }
  492.     catch (Exception e)
  493.     {
  494.       System.out.println("Error loading Look and Feel");
  495.     }
  496.   }
  497. }
  498.  
  499.  
  500.  
  501.  
  502. import java.util.*;
  503. import java.awt.event.*;
  504. import javax.swing.*;
  505.  
  506. public class ToolPanel extends JPanel
  507. {
  508.   protected ArrayList listeners = new ArrayList();
  509.   
  510.   public void addActionListener(ActionListener listener)
  511.   {
  512.     listeners.add(listener);
  513.   }
  514.  
  515.   public void removeActionListener(ActionListener listener)
  516.   {
  517.     listeners.remove(listener);
  518.   }
  519.   
  520.   protected void fireActionEvent(String command)
  521.   {
  522.     ArrayList list = (ArrayList)listeners.clone();
  523.     ActionEvent event = new ActionEvent(
  524.       this, ActionEvent.ACTION_PERFORMED, command);
  525.     for (int i = 0; i < list.size(); i++)
  526.     {
  527.       ActionListener listener = (ActionListener)list.get(i);
  528.       listener.actionPerformed(event);
  529.     }
  530.   }
  531. }
  532.  
  533.  
  534.  
  535. import java.awt.*;
  536. import java.awt.event.*;
  537. import java.awt.image.*;
  538. import javax.swing.*;
  539. import javax.swing.border.*;
  540.  
  541. public class JIconEditor extends JPanel
  542. {
  543.   public JIconEditor()
  544.   {
  545.     BufferedImage image = readBufferedImage("icons/Computer.gif");
  546.     
  547.     setLayout(new BorderLayout());
  548.     
  549.     JPanel west = new JPanel(new BorderLayout());
  550.     JPanel east = new JPanel(new BorderLayout());
  551.     
  552.     ToolPanel action = new ActionToolbar();
  553.     ToolPanel draw = new DrawToolbar();
  554.     JPanel westPanel = new JPanel(new BorderLayout());
  555.     westPanel.add(BorderLayout.NORTH, action);
  556.     westPanel.add(BorderLayout.SOUTH, draw);
  557.  
  558.     west.add(BorderLayout.NORTH, westPanel);
  559.     add(BorderLayout.WEST, west);
  560.  
  561.     JLabel preview = new JLabel(new ImageIcon(image));
  562.     preview.setPreferredSize(new Dimension(26, 26));
  563.     preview.setBorder(BorderFactory.createEtchedBorder());
  564.     
  565.     ToolPanel palette = new PaletteToolbar();
  566.     
  567.     JPanel eastPanel = new JPanel(new BorderLayout());
  568.     eastPanel.add(BorderLayout.NORTH, preview);
  569.     eastPanel.add(BorderLayout.SOUTH, palette);
  570.  
  571.     east.add(BorderLayout.NORTH, eastPanel);
  572.     add(BorderLayout.EAST, east);
  573.  
  574.     PixelEditor editor = new PixelEditor(image, 16, preview);
  575.     add(BorderLayout.CENTER, new JScrollPane(editor));
  576.  
  577.     palette.addActionListener(editor);
  578.     draw.addActionListener(editor);
  579.     action.addActionListener(editor);
  580.   }
  581.   
  582.   public BufferedImage readBufferedImage(String filename)
  583.   {
  584.     ImageIcon icon = new ImageIcon(filename);
  585.     Image image = icon.getImage();
  586.     BufferedImage buffer = new BufferedImage(
  587.       image.getWidth(null), image.getHeight(null),
  588.       BufferedImage.TYPE_INT_ARGB);
  589.     Graphics g = buffer.getGraphics();
  590.     g.drawImage(image, 0, 0, null);
  591.     return buffer;
  592.   }
  593. }
  594.  
  595.  
  596.