// Final project for CSII of S'98 // Patho_Image.java - Image Description import java.applet.Applet; import java.awt.Graphics; import java.awt.Polygon; import java.awt.event.*; import java.awt.*; public class Patho_Image extends Applet implements ItemListener { private ScrollPane Scroller; private SelfContainedCanvas drawCanvas, dc1, dc2; private Image tissue[], star; private List images; private Label l; public void init() { l = new Label("Choose an image: "); l.setFont( new Font( "Serif", Font.BOLD, 12) ); star = getImage (getDocumentBase(), "star.gif" ); tissue = new Image[2]; tissue[0] = getImage (getDocumentBase(), "Brain_tumor.jpg" ); tissue[1] = getImage (getDocumentBase(), "Brain_tumor_closeup.jpg" ); images = new List(2,false); images.add( "Brain Tumor" ); images.add( "BT-CloseUp" ); images.addItemListener( this ); add( l ); add( images ); drawCanvas = new SelfContainedCanvas(tissue[0], star, 0); drawCanvas.setBackground( Color.lightGray ); drawCanvas.setSize( 800, 600 ); Scroller = new ScrollPane(); Scroller.add( drawCanvas ); Scroller.setSize( 580, 330 ); add( Scroller ); Adjustable horizontal = Scroller.getHAdjustable(); horizontal.setUnitIncrement( 4 ); Adjustable vertical = Scroller.getVAdjustable(); vertical.setUnitIncrement( 4 ); } public void itemStateChanged( ItemEvent e ) { drawCanvas.setValues( tissue[images.getSelectedIndex()], star, images.getSelectedIndex() ); drawCanvas.reSetArrow( -10, 0 ); } } class SelfContainedCanvas extends Canvas implements ActionListener, MouseListener { private int aa, bb = -10; private int xPos, yPos = -10; private Polygon p0[], p1[]; private String info0[], info1[];; private Label Show; private Label Show0; private Label Show1; private Label Show2; private Label Show3; private Label Show4; private Font font1, font2; private boolean Flags = false; private Image T, tar; private int ImageNo; private ColorFrame showFrame0, showFrame1; private String s[]; private int xValues0[][] = { {235,226,228,236,251,261,267,266,261,252}, {382,399,411,407,396,378,368,371,377}, {202,214,221,222,218,205,191,188,191}, {415,403,400,405,418,428,437,436,427,419}, {343,353,363,372,366,358,348,342,336}, {287,278,283,307,314,313,300}, {303,299,291,289,288,292,304,310,315,321,322,326,318,311}, {224,238,244,243,231,222,221}, {224,230,232,228,218}, {246,243,234,224,204,195,181,191,202,219,234}, {232,240,248,243,231,226}, {207,243,270,290,308,319,327,323,313,295,276,252,233,212,188,179,170,170,176,189}, {313,347,355,361,364,375,372,390,397,390,368,351,335}, {275,267,267,279,291,304,307,319,331,340,355,360,357,356,337,312,298,289}, {326,320,306,284,236,197,171,155,134,127,135,159,176,192,208,226,254,276,276,265,276,325,337}, {332,336,352,398,415,445,463,486,495,505,512,516,509,486,459,424,391,349,345,350,362,359,356} }; private int yValues0[][] = { {362,371,383,390,393,382,374,365,358,354}, {362,362,374,390,397,395,384,374,365}, {232,233,244,256,264,269,260,247,237}, {225,231,244,253,259,255,244,235,228,226}, {64,63,65,77,88,94,91,83,75}, {66,77,83,92,83,73,65}, {150,180,192,200,213,219,217,210,201,185,175,162,150,147}, {169,169,175,187,188,184,176}, {204,204,211,217,212}, {125,139,143,140,146,155,155,136,131,128,125}, {149,147,156,166,169,162}, {112,100,99,103,118,142,163,188,214,238,252,261,267,262,244,225,202,178,152, 131}, {110,164,190,191,203,195,175,155,135,122,133,141,132}, {319,352,396,417,436,427,415,419,434,438,404,377,347,325,332,334,316,314}, {72,33,20,20,42,76,117,173,233,274,334,384,420,430,424,456,453,447,411,366,318,268,191}, {67,33,24,34,49,70,97,138,163,206,249,294,324,360,407,448,462,457,423,406,377 ,353,327} }; private int xValues1[][] = { {155,174,191,222,239,240,221,207,187,168,149,139,139,139,147}, {239,276,295,301,295,289,274,255,233,232}, {485,466,465,439,432,446,481,514,533,544,547,554,535,517,503,492}, {169,120,111,123,128,152,170,192,199,195}, {290,299,303,299}, {54,61,66,63}, {107,110,116}, {264,268,275,275,271}, {257,267,257,249,248}, {119,113,99,105,115}, {267,250,250,269,286,292,310,314,298}, {27,85,123,238,341,431,497,533,580,563,488,145}, {99,62,50,41,3,3,598,619,615,635,635,600,548,505}, {635,614,614,602,614,630,629,637}, {632,634,514,580} }; private int yValues1[][] = { {380,375,373,387,415,446,464,473,475,472,457,436,419,401,386 }, {188,196,194,200,230,240,242,240,233,209}, {36,192,240,277,321,341,345,309,258,217,180,158,142,124,118,127}, {263,293,306,328,339,320,301,290,275,262}, {82,88,81,76}, {272,282,261,255}, {344,349,345}, {387,394,394,386,382}, {293,321,322,310,299}, {233,254,249,235,229}, {141,161,177,190,187,166,157,151,146}, {260,386,474,472,476,434,373,308,200,99,3,4}, {0,70,105,169,296,473,473,409,378,354,213,147,61,1}, {356,384,416,456,453,403,396,372}, {199,137,7,106} }; private int points0[][] = { {243, 372}, {384,378}, {203,249}, {415,239}, {351,76}, {295,75}, {308,181}, {229,176}, {220,209}, {194,139}, {228,155}, {269,139}, {365,157}, {310,365}, {277,45}, {360,46} }; private int points1[][] = { {184, 426}, {265, 216}, {501,230}, {154,293}, {290,80}, {51,269}, {102,345}, {262,387}, {244,304}, {99,239}, {265,162}, {337,281}, {94,63}, {621,383}, {608,136} }; private String Image0[] = { "Button_1", "Button_2", "Button_3", "Button_4", "Button_5", "Button_6", "Cystic_space_1", "Cystic_space_2", "Bleeding_1", "Bleeding_2", "Bleeding_3", "Tumor", "Ventricles", "Cerebellum", "Hemisphere_1", "Hemisphere_2" }; private String Image1[] = { "Button", "Cystic_space_1", "Cystic_space_2", "Cystic_space_3", "Bleeding_1", "Bleeding_2", "Bleeding_3","Bleeding_4", "Bleeding_5", "Bleeding_6", "Bleeding_7", "Tumor", "Hemisphere", "Ventricle_1", "Ventricle_2" }; private String Title0[], Title1[]; private MenuItem M0[], M1[]; private PopupMenu pop0, pop1; // private Graphics gContext; // private Image buffer; public SelfContainedCanvas(Image I, Image TT, int N) { pop0 = new PopupMenu( "Image0_t" ); pop1 = new PopupMenu( "Image1_t" ); M0 = new MenuItem[Image0.length]; M1 = new MenuItem[Image1.length]; for( int m = 0; m < Image0.length; m++ ) { M0[m] = new MenuItem( Image0[m] ); pop0.add( M0[m] ); M0[m].addActionListener( this ); } for( int m = 0; m < Image1.length; m++ ) { M1[m] = new MenuItem( Image1[m] ); pop1.add( M1[m] ); M1[m].addActionListener( this ); } add( pop0 ); add( pop1 ); enableEvents( AWTEvent.MOUSE_EVENT_MASK ); s = new String[2]; s[0] = "Brain Tumor"; s[1] = "BT-Close Up"; info0 = new String[xValues0.length]; info1 = new String[xValues1.length]; p0 = new Polygon[xValues0.length]; p1 = new Polygon[xValues1.length]; info0[0] = "Buttons used to protect delicate brain tissue when mounting the specimen"; info0[1] = "Cystic spaces within tumor"; info0[2] = "Bleeding within brain tumor"; info0[3] = "Malignant brain tumor"; info0[4] = "Compressed lateral ventricles"; info0[5] = "Cerebellum"; info0[6] = "Cerebral hemisphere"; info1[0] = "Buttons used to protect delicate brain tissue when mounting the specimen"; info1[1] = "Cystic area in brain tumor"; info1[2] = "Area of bleeding (haemorrhage) in brain tumor "; info1[3] = "Malignant brain tumor"; info1[4] = "Cerebral hemisphere"; info1[5] = "Compressed ventricle"; for (int j = 0; j < xValues0.length; j++ ) p0[j] = new Polygon(); for (int j = 0; j < xValues1.length; j++ ) p1[j] = new Polygon(); for (int row = 0; row < xValues0.length; row++) for (int col = 0; col < xValues0[row].length; col++) p0[row].addPoint( xValues0[row][col], yValues0[row][col] ); for (int row = 0; row < xValues1.length; row++) for (int col = 0; col < xValues1[row].length; col++) p1[row].addPoint( xValues1[row][col], yValues1[row][col] ); font1 = new Font( "Serif", Font.BOLD, 22 ); font2 = new Font ("SansSerif", Font.PLAIN, 14 ); Show = new Label( " Directions: " ); Show0 = new Label( " 1. Choose an image in the List box. " ); Show1 = new Label( " 2. Left click on any part of the image " ); Show2 = new Label( " to show the information specific for that part. " ); Show3 = new Label( " 3. Right click on empty part to bring up a popup menu " ); Show4 = new Label( " to find where the part you are interested in is. " ); T = I; ImageNo = N; tar = TT; // buffer = createImage( T.getWidth( this ), T.getHeight( this ) ); // gContext = buffer.getGraphics(); // gContext.setColor( Color.white ); // gContext.fillRect( 0, 0, T.getWidth( this ), T.getHeight( this) ); showFrame0 = new ColorFrame(s[0]); showFrame1 = new ColorFrame(s[1]); addMouseListener( this ); } public void actionPerformed( ActionEvent e ) { if( Flags == true ) { if( ImageNo == 0) for (int i = 0; i < M0.length; i++ ) if( e.getSource() == M0[i] ) { aa = points0[i][0]; bb = points0[i][1]; } if( ImageNo == 1) for (int j = 0; j < M1.length; j++ ) if( e.getSource() == M1[j] ) { aa = points1[j][0]; bb = points1[j][1]; } repaint(); } } public void processMouseEvent( MouseEvent e ) { if( Flags == true ) { if ( ImageNo == 0 && e.isPopupTrigger() ) pop0.show( this, e.getX(), e.getY() ); if ( ImageNo == 1 && e.isPopupTrigger() ) pop1.show( this, e.getX(), e.getY() ); super.processMouseEvent( e ); } } public void reSetArrow( int a, int b ) { aa = a; bb = b; repaint(); } public void setValues(Image IM, Image TT, int NN) { Flags = true; T = IM; tar = TT; ImageNo = NN; repaint(); } public void paint( Graphics g ) { g.setColor( Color.red); g.setFont( font1 ); g.drawString(Show.getText(), 20, 40); g.setColor( Color.black); g.setFont( font2); g.drawString(Show0.getText(), 30, 90); g.drawString(Show1.getText(), 30, 120); g.drawString(Show2.getText(), 30, 150); g.drawString(Show3.getText(), 30, 180); g.drawString(Show4.getText(), 30, 210); if( Flags == true ) { g.drawImage( T, 0, 0, this ); // gContext.fillRect( 0, 0, T.getWidth( this ), T.getHeight( this) ); // gContext.drawImage( T, 0, 0, this ); g.drawImage( tar, aa, bb, this ); } } public void mouseClicked( MouseEvent e ) { xPos = e.getX(); yPos = e.getY(); if( Flags = true ) { if( ImageNo == 0 && ( ! e.isPopupTrigger() ) ) { if( p0[0].contains( xPos, yPos )||p0[1].contains( xPos, yPos ) || p0[2].contains( xPos, yPos )||p0[3].contains( xPos, yPos ) || p0[4].contains( xPos, yPos )||p0[5].contains( xPos, yPos ) ) { showFrame0.setVisible(true); showFrame0.setInfo(info0[0]); } else if( p0[6].contains( xPos, yPos ) || p0[7].contains( xPos, yPos ) ) { showFrame0.setVisible(true); showFrame0.setInfo(info0[1]); } else if (p0[8].contains( xPos, yPos ) || p0[9].contains( xPos, yPos ) || p0[10].contains( xPos, yPos ) ) { showFrame0.setVisible(true); showFrame0.setInfo(info0[2]); } else if (p0[11].contains( xPos, yPos ) ) { showFrame0.setVisible(true); showFrame0.setInfo(info0[3]); } else if (p0[12].contains( xPos, yPos ) ) { showFrame0.setVisible(true); showFrame0.setInfo(info0[4]); } else if (p0[13].contains( xPos, yPos ) ) { showFrame0.setVisible(true); showFrame0.setInfo(info0[5]); } else if (p0[14].contains( xPos, yPos ) || p0[15].contains( xPos, yPos ) ) { showFrame0.setVisible(true); showFrame0.setInfo(info0[6]); } else showFrame0.setVisible(false); } if( ImageNo == 1 && ( ! e.isPopupTrigger() ) ) { if( p1[0].contains( xPos, yPos ) ) { showFrame1.setVisible(true); showFrame1.setInfo(info1[0]); } else if( p1[1].contains( xPos, yPos ) || p1[2].contains( xPos, yPos ) || p1[3].contains( xPos, yPos ) ) { showFrame1.setVisible(true); showFrame1.setInfo(info1[1]); } else if( p1[4].contains( xPos, yPos ) || p1[5].contains( xPos, yPos ) || p1[6].contains( xPos, yPos ) || p1[7].contains( xPos, yPos ) || p1[8].contains( xPos, yPos ) || p1[9].contains( xPos, yPos ) || p1[10].contains( xPos, yPos ) ) { showFrame1.setVisible(true); showFrame1.setInfo(info1[2]); } else if (p1[11].contains( xPos, yPos ) ) { showFrame1.setVisible(true); showFrame1.setInfo(info1[3]); } else if (p1[12].contains( xPos, yPos ) ) { showFrame1.setVisible(true); showFrame1.setInfo(info1[4]); } else if( p1[13].contains( xPos, yPos ) || p1[14].contains( xPos, yPos ) ) { showFrame1.setVisible(true); showFrame1.setInfo(info1[5]); } else showFrame1.setVisible(false); } } } public void mousePressed( MouseEvent e ) { } public void mouseReleased( MouseEvent e ) { } public void mouseEntered( MouseEvent e ) { } public void mouseExited( MouseEvent e ) { } } class ColorFrame extends Frame implements ActionListener, ItemListener { private String ss; private TextArea t; private String fontNames[] = { "TimesRoman", "Courier", "Helvetica" }; private String colorNames[] = { "Black", "Red", "Green", "Blue" }; private Color colorValues[] = { Color.black, Color.red, Color.green, Color.blue }; private MenuBar bar; private Menu formatMenu, fontMenu, colorMenu; private MenuItem fonts[], colors[]; private CheckboxMenuItem readOnly; public ColorFrame( String s ) { super( s ); setSize( 275, 150 ); setLocation(360, 0); t = new TextArea( ss, 2, 20, TextArea.SCROLLBARS_VERTICAL_ONLY); add( t, BorderLayout.CENTER ); t.setFont( new Font( "TimesRoman", Font.PLAIN, 12 ) ); t.setForeground( colorValues[ 0 ] ); bar = new MenuBar(); formatMenu = new Menu( "Format" ); fontMenu = new Menu( "Font" ); fonts = new MenuItem[ fontNames.length ]; for ( int i = 0; i < fonts.length; i++ ) { fonts[ i ] = new MenuItem( fontNames[ i ] ); fontMenu.add( fonts[ i ] ); fonts[ i ].addActionListener( this ); } formatMenu.add( fontMenu ); formatMenu.addSeparator(); colorMenu = new Menu( "Color" ); colors = new MenuItem[ colorNames.length ]; for ( int i = 0; i < colors.length; i++ ) { colors[ i ] = new MenuItem( colorNames[ i ] ); colorMenu.add( colors[ i ] ); colors[ i ].addActionListener( this ); } formatMenu.add( colorMenu ); formatMenu.addSeparator(); readOnly = new CheckboxMenuItem( "Read-Only" ); readOnly.addItemListener( this ); formatMenu.add( readOnly ); bar.add( formatMenu ); setMenuBar( bar ); addWindowListener( new CloseWindow() ); } public void setInfo( String s1 ) { ss = s1; t.setText( ss ); } public void actionPerformed( ActionEvent e ) { for ( int i = 0; i < fonts.length; i++ ) if ( e.getSource() == fonts[ i ] ) { t.setFont( new Font( fonts[ i ].getLabel(), Font.PLAIN, 12 ) ); break; } for ( int i = 0; i < colors.length; i++ ) if ( e.getSource() == colors[ i ] ) { t.setForeground( colorValues[ i ] ); break; } } public void itemStateChanged( ItemEvent e ) { t.setEditable( ! t.isEditable() ); } } class CloseWindow extends WindowAdapter { public void windowClosing( WindowEvent e ) { e.getWindow().setVisible( false ); } }