Kód:
// Decompiled by DJ v3.9.9.91 Copyright 2005 Atanas Neshkov Date: 20.5.2006 20:44:20
// Home Page : http://members.fortunecity.com/neshkov/dj.html - Check often for new version!
// Decompiler options: packimports(3)
// Source File Name: C:\JavaApplets\CourseMenu\CourseMenu.java
import java.applet.Applet;
import java.applet.AppletContext;
import java.awt.*;
import java.awt.image.MemoryImageSource;
import java.awt.image.PixelGrabber;
import java.net.URL;
public class CourseMenu extends Applet
implements Runnable
{
public void start()
{
if(m_threadAnim == null)
{
m_threadAnim = new Thread(this);
m_threadAnim.start();
}
}
public void stop()
{
if(m_threadAnim != null)
{
m_threadAnim.stop();
m_threadAnim = null;
}
}
private String[] parseString(String s, String s1)
throws StringIndexOutOfBoundsException
{
int i = 0;
int j = 0;
do
{
j = s.indexOf(s1, j);
if(j < 0)
break;
i++;
j++;
} while(true);
int k = i + 1;
String as[] = new String[k];
int l = 0;
boolean flag = false;
for(int j1 = 0; j1 < k; j1++)
{
int i1 = s.indexOf(s1, l);
if(i1 < 0)
{
as[j1] = s.substring(l).trim();
break;
}
as[j1] = s.substring(l, i1).trim();
l = i1 + 1;
if(i1 >= s.length())
break;
}
return as;
}
private void draw()
{
m_menuSelected = null;
Graphics g = m_imageBuffer.getGraphics();
g.setFont(m_fontMenuItem);
g.setColor(m_colorBackground);
g.fillRect(0, 0, m_nWindowWidth, m_nWindowHeight);
int i = 0;
for(int j = 0; j < m_nMenus; j++)
i = m_menu[j].draw(i, g);
g.dispose();
Graphics g1 = getGraphics();
g1.drawImage(m_imageBuffer, 0, 0, null);
m_menuCurrent = m_menuSelected;
if(m_menuCurrent != null)
{
showStatus(m_menuCurrent.m_sURL);
return;
} else
{
showStatus(" ");
return;
}
}
public boolean mouseExit(Event event, int i, int j)
{
m_bMouseInWindow = false;
m_bMouseMoveSwitch = true;
m_bRedraw = true;
m_nMouseX = -1;
m_nMouseY = -1;
return true;
}
public boolean mouseMove(Event event, int i, int j)
{
m_bMouseInWindow = true;
m_bMouseMoveSwitch = true;
m_bRedraw = true;
m_nMouseX = i;
m_nMouseY = j;
return true;
}
private void initialization()
{
String s = null;
boolean flag = false;
Double double1 = null;
MediaTracker mediatracker = new MediaTracker(this);
Dimension dimension = size();
m_nWindowWidth = dimension.width;
m_nWindowHeight = dimension.height;
m_imageBuffer = createImage(m_nWindowWidth, m_nWindowHeight);
Graphics g = m_imageBuffer.getGraphics();
m_sDefaultTarget = getParameter("defaultTarget");
s = getParameter("bgColor");
if(s != null)
{
m_colorBackground = parseColorParam(s);
if(m_colorBackground == null)
{
m_stringError = new String("bgColor parameter error");
return;
}
}
String s2 = getParameter("fontName");
if(s2 == null)
s2 = new String("Helvetica");
String s3 = getParameter("fontNameBlurb");
if(s3 == null)
s3 = s2;
s = getParameter("fontSize");
int i = 11;
if(s != null)
i = Integer.parseInt(s);
if(i < 1)
{
m_stringError = new String("fontSize parameter error");
return;
}
s = getParameter("fontSizeBlurb");
int j = i;
if(s != null)
j = Integer.parseInt(s);
if(j < 1)
{
m_stringError = new String("fontSizeBlurb parameter error");
return;
}
s = getParameter("fontLeading");
boolean flag1 = false;
int k = 0;
if(s != null)
{
flag1 = true;
k = Integer.parseInt(s);
}
s = getParameter("fontStyle");
byte byte0 = 0;
if(s != null)
{
byte0 = -1;
if(s.equalsIgnoreCase("PLAIN"))
byte0 = 0;
if(s.equalsIgnoreCase("BOLD"))
byte0 = 1;
if(s.equalsIgnoreCase("ITALIC"))
byte0 = 2;
if(byte0 < 0)
{
m_stringError = new String("fontStyle parameter error");
return;
}
}
s = getParameter("fontStyleBlurb");
byte byte1 = byte0;
if(s != null)
{
byte1 = -1;
if(s.equalsIgnoreCase("PLAIN"))
byte1 = 0;
if(s.equalsIgnoreCase("BOLD"))
byte1 = 1;
if(s.equalsIgnoreCase("ITALIC"))
byte1 = 2;
if(byte1 < 0)
{
m_stringError = new String("fontStyleBlurb parameter error");
return;
}
}
m_fontMenuItem = new Font(s2, byte0, i);
m_fontBlurb = new Font(s3, byte1, j);
FontMetrics fontmetrics = null;
FontMetrics fontmetrics1 = null;
g.setFont(m_fontMenuItem);
fontmetrics = g.getFontMetrics();
int l = fontmetrics.getHeight();
int i1 = fontmetrics.getAscent();
int j1 = fontmetrics.getDescent();
g.setFont(m_fontBlurb);
fontmetrics1 = g.getFontMetrics();
int k1 = fontmetrics1.getHeight();
int l1 = fontmetrics1.getAscent();
int i2 = fontmetrics1.getDescent();
if(l > k1)
{
if(!flag1)
m_nItemHeight = l;
else
m_nItemHeight = i1 + j1 + k;
m_nItemBaseline = i1;
} else
{
if(!flag1)
m_nItemHeight = k1;
else
m_nItemHeight = l1 + i2 + k;
m_nItemBaseline = l1;
}
boolean flag2 = false;
String s4 = getParameter("fontNameHeader");
if(s4 == null)
s4 = new String("Helvetica");
else
flag2 = true;
s = getParameter("fontSizeHeader");
int j2 = 14;
if(s != null)
{
j2 = Integer.parseInt(s);
flag2 = true;
}
if(j2 < 1)
{
m_stringError = new String("fontSizeHeader parameter error");
return;
}
s = getParameter("fontStyleHeader");
byte byte2 = 1;
if(s != null)
{
byte2 = -1;
if(s.equalsIgnoreCase("PLAIN"))
byte2 = 0;
if(s.equalsIgnoreCase("BOLD"))
byte2 = 1;
if(s.equalsIgnoreCase("ITALIC"))
byte2 = 2;
if(byte2 < 0)
{
m_stringError = new String("fontStyleHeader parameter error");
return;
}
flag2 = true;
}
s = getParameter("fontLeadingHeader");
int k2 = 0;
if(s != null)
{
k2 = Integer.parseInt(s);
flag2 = true;
}
s = getParameter("fontAdvanceHeader");
int l2 = 0;
if(s != null)
{
l2 = Integer.parseInt(s);
flag2 = true;
}
s = getParameter("headerStringColor");
Color color = Color.black;
if(s != null)
{
color = parseColorParam(s);
if(color == null)
{
m_stringError = new String("headerStringColor parameter error");
return;
}
flag2 = true;
}
s = getParameter("headerStringHighlight");
Color color1 = color;
if(s != null)
{
color1 = parseColorParam(s);
if(color1 == null)
{
m_stringError = new String("headerStringHighlight parameter error");
return;
}
flag2 = true;
}
Font font = null;
boolean flag3 = false;
if(flag2)
{
font = new Font(s4, byte2, j2);
byte byte3 = 40;
byte byte4 = 40;
int j3 = byte3 * byte4;
Image image2 = createImage(byte3, byte4);
Graphics g1 = image2.getGraphics();
g1.setColor(Color.white);
g1.fillRect(0, 0, byte3, byte4);
g1.setFont(font);
g1.setColor(Color.black);
g1.drawString("M", 0, byte4 / 2);
g1.dispose();
int ai[] = new int[byte3 * byte4];
boolean flag4 = false;
PixelGrabber pixelgrabber = new PixelGrabber(image2, 0, 0, byte3, byte4, ai, 0, byte3);
try
{
pixelgrabber.grabPixels();
}
catch(InterruptedException _ex) { }
catch(ArrayStoreException _ex)
{
flag4 = true;
}
int k3 = 0;
int l3 = 0;
int j4 = 0;
for(int k4 = 0; k4 < j3; k4++)
{
if(k3 > 2)
break;
switch(k3)
{
default:
break;
case 0: // '\0'
l3 = ai[k4];
k3 = 1;
break;
case 1: // '\001'
if(ai[k4] != l3)
{
j4 = ai[k4];
k3 = 2;
}
break;
case 2: // '\002'
if(ai[k4] != l3 && ai[k4] != j4)
k3 = 3;
break;
}
}
if(k3 <= 2 && !flag4)
flag3 = true;
}
s = getParameter("antialias");
if(s != null && s.equalsIgnoreCase("false"))
flag3 = false;
s = getParameter("indentation");
m_nMargin = 5;
if(s != null)
m_nMargin = Integer.parseInt(s);
if(m_nMargin < 0)
{
m_stringError = new String("Negative indentation not allowed");
return;
}
s = getParameter("rollover");
if(s != null && s.equalsIgnoreCase("true"))
m_bTopLevelRollover = true;
s = getParameter("StopOnSelect");
if(s != null && s.equalsIgnoreCase("true"))
m_bStopOnSelect = true;
s = getParameter("itemColor");
if(s != null)
{
m_colorNormal = parseColorParam(s);
if(m_colorNormal == null)
{
m_stringError = new String("itemColor parameter error");
return;
}
}
s = getParameter("itemColorBlurb");
m_colorNormalBlurb = m_colorNormal;
if(s != null)
{
m_colorNormalBlurb = parseColorParam(s);
if(m_colorNormalBlurb == null)
{
m_stringError = new String("itemColorBlurb parameter error");
return;
}
}
s = getParameter("highlightColor");
if(s != null)
{
m_colorHighlight = parseColorParam(s);
if(m_colorHighlight == null)
{
m_stringError = new String("highlightColor parameter error");
return;
}
}
s = getParameter("highlightColorBlurb");
m_colorHighlightBlurb = m_colorHighlight;
if(s != null)
{
m_colorHighlightBlurb = parseColorParam(s);
if(m_colorHighlightBlurb == null)
{
m_stringError = new String("highlightColorBlurb parameter error");
return;
}
}
flag = false;
s = getParameter("speed");
if(s != null)
{
flag = true;
try
{
double1 = Double.valueOf(s);
}
catch(NumberFormatException _ex)
{
flag = false;
}
}
if(flag)
{
double d = double1.doubleValue();
if(d >= 0.0D)
m_dVelocity = d;
}
int i3 = 0;
Object obj = null;
Object obj1 = null;
Object obj2 = null;
Object obj3 = null;
String as[] = null;
Object obj4 = null;
Object obj5 = null;
m_menuChain = null;
m_nMenus = 0;
do
{
Image image1 = null;
String s7 = new String("m" + (m_nMenus + 1));
String s1 = getParameter(s7);
if(s1 == null)
break;
try
{
as = parseString(s1, ",");
}
catch(StringIndexOutOfBoundsException _ex) { }
if(as.length < 1)
{
m_stringError = new String("Menu " + (m_nMenus + 1) + " param missing.");
break;
}
if(as[0] == null)
{
m_stringError = new String("Menu " + (m_nMenus + 1) + " param error.");
break;
}
Image image;
if(flag2)
{
image = createHeaderImage(as[0], color, m_colorBackground, g, font, k2, l2);
if(flag3)
image = antialiasImage(image);
if(!color.equals(color1))
{
image1 = createHeaderImage(as[0], color1, m_colorBackground, g, font, k2, l2);
if(flag3)
image1 = antialiasImage(image1);
}
} else
{
i3++;
image = getImage(getDocumentBase(), as[0]);
mediatracker.addImage(image, i3);
while(!mediatracker.checkID(i3, true))
try
{
Thread.sleep(100L);
}
catch(InterruptedException _ex) { }
if(mediatracker.statusID(i3, true) != 8)
{
m_stringError = new String("Menu " + (m_nMenus + 1) + " image error.");
break;
}
}
if(as.length >= 2 && as[1] != null && as[1].length() > 1 && !flag2)
{
i3++;
image1 = getImage(getDocumentBase(), as[1]);
mediatracker.addImage(image1, i3);
while(!mediatracker.checkID(i3, true))
try
{
Thread.sleep(100L);
}
catch(InterruptedException _ex) { }
if(mediatracker.statusID(i3, true) != 8)
{
m_stringError = new String("Menu " + (m_nMenus + 1) + " highlight image error.");
break;
}
}
String s5 = null;
if(as.length >= 3 && as[2] != null && as[2].length() > 0)
s5 = as[2];
String s6 = m_sDefaultTarget;
if(as.length >= 4 && as[3] != null && as[3].length() > 0)
s6 = as[3];
cmMenu cmmenu = new cmMenu(image, image1, s5, s6, this);
cmmenu.m_menuNext = m_menuChain;
m_menuChain = cmmenu;
m_nMenus++;
addSubmenuItems(cmmenu, 1, s7, g);
cmmenu.complete();
} while(true);
m_menu = new cmMenu[m_nMenus];
cmMenu cmmenu1 = m_menuChain;
for(int i4 = m_nMenus - 1; i4 >= 0; i4--)
{
m_menu[i4] = cmmenu1;
cmmenu1 = cmmenu1.m_menuNext;
}
m_bInitialized = true;
m_bRedraw = true;
}
public boolean mouseDown(Event event, int i, int j)
{
if(!m_bInitialized)
return true;
cmMenu cmmenu = m_menuSelected;
String s = null;
String s1 = null;
if(cmmenu != null)
{
if(cmmenu.m_nItems > 0 && (cmmenu.m_nLevel > 0 || !m_bTopLevelRollover))
{
cmmenu.open();
return true;
}
s = cmmenu.m_sURL;
s1 = cmmenu.m_sTarget;
}
if(s != null)
{
URL url;
try
{
url = new URL(s);
}
catch(Exception _ex)
{
showStatus("Bad URL");
return true;
}
if(s1 == null)
getAppletContext().showDocument(url);
else
getAppletContext().showDocument(url, s1);
if(m_bStopOnSelect)
stop();
}
return true;
}
private Image createHeaderImage(String s, Color color, Color color1, Graphics g, Font font, int i, int j)
{
String as[] = null;
try
{
as = parseString(s, "|");
}
catch(StringIndexOutOfBoundsException _ex) { }
g.setFont(font);
FontMetrics fontmetrics = g.getFontMetrics();
int k = 0;
int l = fontmetrics.getHeight() * as.length + i;
for(int i1 = 0; i1 < as.length; i1++)
if(as[i1] != null && as[i1].length() > 0)
k = Math.max(fontmetrics.stringWidth(as[i1]) + (as[i1].length() - 1) * j, k);
Image image = createImage(k, l);
Graphics g1 = image.getGraphics();
g1.setColor(color1);
g1.fillRect(0, 0, k, l);
int j1 = fontmetrics.getAscent() + i;
g1.setFont(font);
g1.setColor(color);
for(int k1 = 0; k1 < as.length; k1++)
{
if(as[k1] != null && as[k1].length() > 0)
if(j == 0)
{
g1.drawString(as[k1], 0, j1);
} else
{
int l1 = 0;
char ac[] = as[k1].toCharArray();
for(int i2 = 0; i2 < ac.length; i2++)
{
String s1 = new String(ac, i2, 1);
g1.drawString(s1, l1, j1);
l1 += fontmetrics.stringWidth(s1) + j;
}
}
j1 += fontmetrics.getHeight();
}
g1.dispose();
return image;
}
public boolean mouseEnter(Event event, int i, int j)
{
m_bMouseInWindow = true;
m_bMouseMoveSwitch = true;
m_bRedraw = true;
m_nMouseX = i;
m_nMouseY = j;
return true;
}
private Image antialiasImage(Image image)
{
int i = image.getWidth(null);
int j = image.getHeight(null);
int ai[] = new int[i * j];
int ai1[] = new int[i * j];
PixelGrabber pixelgrabber = new PixelGrabber(image, 0, 0, i, j, ai, 0, i);
try
{
pixelgrabber.grabPixels();
}
catch(InterruptedException _ex)
{
return image;
}
if((ai[0] & 0xff000000) != 0xff000000)
return image;
for(int k = 0; k < j - 1; k++)
{
for(int l = 0; l < i - 1; l++)
{
int i1 = ai[l + k * i];
int j1 = ai[l + k * i + 1];
int k1 = ai[l + (k + 1) * i];
int l1 = ai[l + (k + 1) * i + 1];
int i2 = 0;
int j2 = 0;
int k2 = 0;
int l2 = 0;
if(k == 0 && l == 0)
i2 = i1;
else
i2 = ai1[l + k * i];
if(k == 0)
j2 = j1;
else
j2 = ai1[l + k * i + 1];
if(l == 0)
k2 = k1;
else
k2 = ai1[l + (k + 1) * i];
l2 = l1;
if(i1 == l1)
{
if(j1 != i1)
j2 = modifyColor(j1, i1);
if(k1 != i1)
k2 = modifyColor(k1, i1);
}
if(j1 == k1)
{
if(i1 != j1)
i2 = modifyColor(i1, j1);
if(l1 != j1)
l2 = modifyColor(l1, j1);
}
ai1[l + k * i] = i2;
ai1[l + k * i + 1] = j2;
ai1[l + (k + 1) * i] = k2;
ai1[l + (k + 1) * i + 1] = l2;
}
}
image.flush();
Image image1 = createImage(new MemoryImageSource(i, j, ai1, 0, i));
return image1;
}
private Color parseColorParam(String s)
{
String s1;
try
{
s1 = s.substring(0, 1);
}
catch(StringIndexOutOfBoundsException _ex)
{
return null;
}
if(s1.equals("#"))
{
try
{
s1 = s.substring(1);
}
catch(StringIndexOutOfBoundsException _ex)
{
return null;
}
return new Color(Integer.parseInt(s1, 16));
}
try
{
s1 = s.substring(0, 3);
}
catch(StringIndexOutOfBoundsException _ex)
{
return null;
}
int i = Integer.parseInt(s1);
try
{
s1 = s.substring(3, 6);
}
catch(StringIndexOutOfBoundsException _ex)
{
return null;
}
int j = Integer.parseInt(s1);
try
{
s1 = s.substring(6);
}
catch(StringIndexOutOfBoundsException _ex)
{
return null;
}
int k = Integer.parseInt(s1);
return new Color(i, j, k);
}
private int modifyColor(int i, int j)
{
int k = i >> 16 & 0xff;
int l = i >> 8 & 0xff;
int i1 = i & 0xff;
int j1 = j >> 16 & 0xff;
int k1 = j >> 8 & 0xff;
int l1 = j & 0xff;
int i2 = (k * 2 + j1) / 3;
int j2 = (l * 2 + k1) / 3;
int k2 = (i1 * 2 + l1) / 3;
return i2 | j2 << 8 | k2 << 16 | 0xff000000;
}
public void run()
{
if(!m_bInitialized)
{
initialization();
if(!m_bInitialized)
{
repaint();
stop();
}
}
do
{
do
try
{
Thread.sleep(50L);
}
catch(InterruptedException _ex)
{
stop();
}
while(!m_bRedraw);
m_bRedraw = false;
m_lLatestTime = System.currentTimeMillis();
if(m_bMouseMoveSwitch)
{
m_bMouseMoved = true;
m_bMouseMoveSwitch = false;
}
draw();
m_bMouseMoved = false;
System.gc();
} while(true);
}
public CourseMenu()
{
m_colorBackground = Color.white;
m_colorNormal = Color.black;
m_colorHighlight = Color.red;
m_colorNormalBlurb = Color.black;
m_colorHighlightBlurb = Color.red;
m_dVelocity = 90D;
}
private void addSubmenuItems(cmMenu cmmenu, int i, String s, Graphics g)
{
int j = 1;
Object obj = null;
String as[] = null;
do
{
String s1;
if(i == 1)
s1 = new String(s + "i" + j);
else
s1 = new String(s + "." + j);
String s2 = getParameter(s1);
if(s2 != null)
{
try
{
as = parseString(s2, ",");
}
catch(StringIndexOutOfBoundsException _ex) { }
String s3 = new String("(???)");
if(as.length >= 1 && as[0] != null && as[0].length() >= 1)
s3 = as[0];
String s4 = null;
if(as.length >= 2 && as[1] != null && as[1].length() >= 1)
s4 = as[1];
String s5 = m_sDefaultTarget;
if(as.length >= 3 && as[2] != null && as[2].length() >= 1)
s5 = as[2];
cmMenu cmmenu1 = new cmMenu(i, s3, s4, s5, g, cmmenu, this);
cmmenu.addItem(cmmenu1);
addSubmenuItems(cmmenu1, i + 1, s1, g);
cmmenu1.complete();
j++;
} else
{
return;
}
} while(true);
}
public void paint(Graphics g)
{
if(!m_bInitialized)
{
Object obj = null;
Object obj1 = null;
Dimension dimension = size();
boolean flag = false;
boolean flag1 = false;
if(m_stringError != null)
{
showStatus(m_stringError);
String s = new String("ERROR");
g.setColor(Color.white);
g.fillRect(0, 0, dimension.width, dimension.height);
g.setFont(new Font("Helvetica", 1, 24));
g.setColor(Color.red);
FontMetrics fontmetrics = g.getFontMetrics();
int i = (dimension.width - fontmetrics.stringWidth(s)) / 2;
int k = dimension.height / 2;
g.drawString(s, i, k);
return;
} else
{
String s1 = new String("CourseMenu loading...");
g.setColor(Color.white);
g.fillRect(0, 0, dimension.width, dimension.height);
g.setFont(new Font("Helvetica", 0, 10));
g.setColor(Color.black);
FontMetrics fontmetrics1 = g.getFontMetrics();
int j = (dimension.width - fontmetrics1.stringWidth(s1)) / 2;
int l = dimension.height / 2;
g.drawString(s1, j, l);
return;
}
} else
{
m_bRedraw = true;
return;
}
}
int m_nWindowWidth;
int m_nWindowHeight;
Image m_imageBuffer;
String m_stringError;
public Color m_colorBackground;
public Font m_fontMenuItem;
public Font m_fontBlurb;
public int m_nItemHeight;
public int m_nItemBaseline;
public int m_nMargin;
public Color m_colorNormal;
public Color m_colorHighlight;
public Color m_colorNormalBlurb;
public Color m_colorHighlightBlurb;
public double m_dVelocity;
Thread m_threadAnim;
public long m_lLatestTime;
public boolean m_bRedraw;
boolean m_bInitialized;
String m_sDefaultTarget;
public int m_nMouseX;
public int m_nMouseY;
public boolean m_bMouseInWindow;
public boolean m_bMouseMoved;
public boolean m_bMouseMoveSwitch;
public boolean m_bTopLevelRollover;
public boolean m_bStopOnSelect;
int m_nMenus;
cmMenu m_menu[];
public cmMenu m_menuChain;
public cmMenu m_menuSelected;
cmMenu m_menuCurrent;
}