//****************************************************************************** // Welcome.java: Applet // //****************************************************************************** // Written with Microsoft Visual J++ version 1.1 // (which is based on the 1.0.2 version of JDK) import java.applet.*; import java.awt.*; import java.util.*; import java.net.*; class Enkelin { String label; String explanation; String theURL; String howToOpen; Rectangle rc; Point center; boolean mouseOnMe; public Enkelin() { label = new String(); explanation = new String(); theURL = new String(); howToOpen = new String(); rc = new Rectangle(); center = new Point(0,0); mouseOnMe = false; } public void refillElements(String l,String e,Rectangle r,Point c,boolean m) { label = l; explanation = e; rc.x = r.x; rc.y = r.y; rc.width = r.width; rc.height = r.height; center.x = c.x; center.y = c.y; mouseOnMe = m; } } class Tochter { String label; Rectangle rc; Point center; boolean mouseOnMe; Vector Enkelinnen; public Tochter() { label = new String(); rc = new Rectangle(); center = new Point(0,0); mouseOnMe = false; Enkelinnen = new Vector(10,1); } } class Mutter { String label; Rectangle rc; Point center; Vector Toechter; // Zustand int lastMouOnWasDaughterNo; int lastMouOnWasGrandDaughterNo; public Mutter() { label = new String(); rc = new Rectangle(); center = new Point(0,0); Toechter = new Vector(10,1); lastMouOnWasDaughterNo = 9999; lastMouOnWasGrandDaughterNo = 9999; } public boolean mouseEnteredTochter(int x,int y) { int daughterNo = -1; // also auf keiner for (Enumeration enum = Toechter.elements();enum.hasMoreElements();) { Tochter tochter = (Tochter) enum.nextElement(); daughterNo++; if (tochter.rc.inside(x,y)) // Maus möglicherweise über neuer Tochter { if (daughterNo != lastMouOnWasDaughterNo) // Maus über neuer Tochter ! { lastMouOnWasDaughterNo = daughterNo; // merken,welche das ist clearLastDaughterMouseOnMe(); tochter.mouseOnMe = true; return true; } } } return false; } private void clearLastDaughterMouseOnMe() { for (Enumeration enum = Toechter.elements();enum.hasMoreElements();) { Tochter tochter = (Tochter) enum.nextElement(); tochter.mouseOnMe = false; } } public boolean mouseEnteredEnkelin(int x,int y) { int grandDaughterNo = -1; // also auf keiner for (Enumeration enum = Toechter.elements();enum.hasMoreElements();) { Tochter tochter = (Tochter) enum.nextElement(); for (Enumeration enum2 = tochter.Enkelinnen.elements();enum2.hasMoreElements();) { Enkelin enkelin = (Enkelin) enum2.nextElement(); grandDaughterNo++; // es werden ALLE einfach durchgezählt if (enkelin.rc.inside(x,y)) // Maus möglicherweise über neuer Enkelin { if (tochter.mouseOnMe && grandDaughterNo != lastMouOnWasGrandDaughterNo) // Maus über neuer Enkelin ! { lastMouOnWasGrandDaughterNo = grandDaughterNo; // merken,welche das ist clearLastGrandDaughterMouseOnMe(); enkelin.mouseOnMe = true; return true; } } } } return false; } private void clearLastGrandDaughterMouseOnMe() { for (Enumeration enum = Toechter.elements();enum.hasMoreElements();) { Tochter tochter = (Tochter) enum.nextElement(); for (Enumeration enum2 = tochter.Enkelinnen.elements();enum2.hasMoreElements();) { Enkelin enkelin = (Enkelin) enum2.nextElement(); enkelin.mouseOnMe = false; } } } } //============================================================================== // Hauptklasse für Applet Welcome // //============================================================================== public class Welcome extends Applet { private boolean busyFlag = false; private boolean inErrorCondition = false; private String theErrorIs = "Fehlerursache nicht gefunden"; private Mutter dieMutter = new Mutter(); int cTbl[][] = // Farbtabelle { {253,181,170}, // 1 {254,192,169}, // 2 {253,222,170}, // 3 {220,254,169}, // 4 {182,254,169}, // 5 {169,254,169}, // 6 {169,254,190}, // 7 {170,253,220}, // 8 {170,224,253}, // 9 {171,180,252}, // 10 {185,159,254}, // 11 {220,150,253} // 12 }; Color standardAbgetoentesWeiss = new Color(255,251,240); // Buchheit S.83 Color backgroundColor = new Color(0,0,0); //(164,151,145) wäre Systemartig Font MutterFont = new Font("Arial",Font.PLAIN,14); Font TochterFont = new Font("Arial",Font.PLAIN,10); Font EnkelinFont = new Font("Arial",Font.PLAIN,10); FontMetrics fm; // PARAMETER-UNTERSTÜTZUNG: // Mit Hilfe von Parametern kann ein HTML-Autor Informationen an das Applet übergeben, // indem er die Marke innerhalb der Marke verwendet und damit die // Infomationen übergibt. Die folgenden Variablen dienen dem Speichern // der Parameter. //-------------------------------------------------------------------------- // Elemente für Applet-Parameter // = //-------------------------------------------------------------------------- private String m_Eintraege = ""; // Parametername. Um den Namen eines Parameters zu ändern, ist nur eine einzige // Änderung erforderlich. Ändern Sie dazu den Wert der folgenden Parameter-Zeichenfolge. //-------------------------------------------------------------------------- private final String PARAM_Eintraege = "Eintraege"; // Welcome Klassen-Konstruktor //-------------------------------------------------------------------------- public Welcome() { // ZU ERLEDIGEN: Platzieren Sie hier Code für den Konstruktor } // APPLET-INFO-UNTERSTÜTZUNG: // Die Methode getAppletInfo() gibt eine Zeichenfolge zurück, die Autor/Autorin, // Copyright-Datum oder verschiedene andere Informationen des Applets beschreibt //-------------------------------------------------------------------------- public String getAppletInfo() { return "Name: Welcome\r\n" + "Autor: Walter Piechulla\r\n" + "(c) 1998 Projekt Wissensmanagement im Studium\r\n" + "Erstellt mit Microsoft Visual J++ Version 1.1"; } // PARAMETER-UNTERSTÜTZUNG // Die Methode getParameterInfo() liefert ein Array von Zeichenfolgen zurück, die // die Parameter beschreibt, die dieses Applet versteht. // // Welcome Parameter-Information: // { "Name", "Typ", "Beschreibung" }, //-------------------------------------------------------------------------- public String[][] getParameterInfo() { String[][] info = { { PARAM_Eintraege, "String", "Mutter$Tochter§Enkelin|Labeltext*_selfODER_blank#URL]" }, }; return info; } //Die Methode init() wird vom AWT aufgerufen, wenn ein Applet erstmals geladen oder //neu geladen wird. Überschreiben Sie diese Methode, um jede Initialisierung auszuführen, //die das Applet benötigt (z. B. die Initialisierung von Datenstrukturen, das Laden von Bildern oder //Schriftarten, das Erstellen von Rahmenfenstern, das Festlegen des Layout-Managers oder das Hinzufügen von //Komponenten der Benutzeroberfläche). //-------------------------------------------------------------------------- public void init() { // PARAMETER-UNTERSTÜTZUNG // Der folgende Code ruft die Werte von jedem Parameter ab, der // mit der Marke angegeben ist, und speichert diesen in eine // Member-Variable. //---------------------------------------------------------------------- String param; // Entraege: Mutter|Tochter|Enkelin - Tripel //---------------------------------------------------------------------- param = getParameter(PARAM_Eintraege); if (param != null) { m_Eintraege = param; String mothersName = "InitiallyNothing"; Vector daughtersNames = new Vector(12,10); boolean motherIdentified = false; boolean firstEintrag = true; for (StringTokenizer t = new StringTokenizer(m_Eintraege, "]") ; t.hasMoreTokens() ; ) { String str = t.nextToken(); int i = str.indexOf('$'); int j = str.indexOf('§'); int k = str.indexOf('|'); int l = str.indexOf('*'); int m = str.indexOf('#'); if (i <= 0 || j <= 0 || k <= 0 || l <= 0 || m <= 0) { // Argumentfehler, Möglichkeit 1 inErrorCondition = true; theErrorIs = "Mindestens einer der Eintraege nicht wohlgeformt"; return; } else { // Argumentfehler, Möglichkeit 2 if (!firstEintrag && (0 != mothersName.compareTo(str.substring(0,i)))) { inErrorCondition = true; theErrorIs = "Multiple Mutter-Knoten gefunden"; return; } else // Soweit in Ordnung, das Token interpretieren { // Mutter-Teil des Tokens bearbeiten if (!motherIdentified) { mothersName = str.substring(0,i); dieMutter.label = str.substring(0,i); motherIdentified = true; } // Tochter-Teil des Tokens bearbeiten if (daughtersNames.contains(str.substring(i+1,j))) { // nix, keine gleichnamigen Töchter erlaubt } else // erzeuge neue Tochter { Tochter tochter = new Tochter(); tochter.label = str.substring(i+1,j); dieMutter.Toechter.addElement(tochter); // Namen der schon erzeugten merken daughtersNames.addElement(tochter.label); } // Enkelin und URL-Teil etc. des Tokens bearbeiten // Suche die Tochter, die diese Enkelin bekommt for (Enumeration enum = dieMutter.Toechter.elements();enum.hasMoreElements();) { Tochter tochter = (Tochter) enum.nextElement(); if (0 == tochter.label.compareTo(str.substring(i+1,j))) // das ist sie { Enkelin enkelin = new Enkelin(); enkelin.label = str.substring(j+1,k); enkelin.explanation = str.substring(k+1,l); enkelin.howToOpen = str.substring(l+1,m); enkelin.theURL = str.substring(m+1); tochter.Enkelinnen.addElement(enkelin); } } } firstEintrag = false; } } } } // Hier zusätzlichen Bereinigungscode für das Applet platzieren. destroy() wird aufgerufen, // wenn das Applet beendet und entladen wird //------------------------------------------------------------------------- public void destroy() { // ZU ERLEDIGEN: Platzieren Sie hier Bereinigungscode für das Applet } // Welcome Zeichnungsbehandlungsroutine //-------------------------------------------------------------------------- public void paint(Graphics g) { if (inErrorCondition) { g.drawString(theErrorIs,10,20); inErrorCondition = false; } int idxCC = 0; // Index für Farbwahl Enkelin drawMyExplanation = new Enkelin(); // Als Puffer für eine aus der Liste boolean anyEnkelinPressed = false; Dimension dim = size(); dieMutter.center.x = dim.width/2; dieMutter.center.y = dim.height/2; // Berechne die Daten der Mutter computeTheMother(); Point lastCenter = new Point(dieMutter.center.x+18, dieMutter.center.y-(dieMutter.rc.height-1)*3); // Zentrum des 1. Tochter-Labels... boolean initialNode = true; for (Enumeration enum = dieMutter.Toechter.elements();enum.hasMoreElements();) { Tochter tochter = (Tochter) enum.nextElement(); // Benutze zunächst die zuletzt berechneten Koordinaten tochter.center = lastCenter; // Berechne und zeichne Tochter fm = getFontMetrics(TochterFont); computeDaughtersRectangle(tochter,fm); // Verschiebe das Rechteck if (!initialNode) { getNiceNonIntersectingRc(dieMutter.rc,tochter.rc); } initialNode = false; // Farbe wählen Color dColor = new Color(cTbl[idxCC][0],cTbl[idxCC][1],cTbl[idxCC][2]); idxCC++; // Zentrum: Update tochter.center.x = tochter.rc.x + tochter.rc.width/2; tochter.center.y = tochter.rc.y + tochter.rc.height/2; // Zeichne drawTheDaughter(g,tochter,dColor,TochterFont,fm,false); // Zeichne die Mutter (nach jeder Tochter erneut) drawTheMother(g,standardAbgetoentesWeiss,MutterFont); if (tochter.mouseOnMe) { Point blumenStiel = new Point(tochter.center.x,tochter.center.y); getNiceContinuation(blumenStiel,dieMutter.center,dim); g.setColor(dColor); g.drawLine(tochter.center.x,tochter.center.y,blumenStiel.x,blumenStiel.y); fm = getFontMetrics(EnkelinFont); // Zeichne die Enkel boolean isFirstGrDa = true; // Nur Verbindungslinien for (Enumeration enum2 = tochter.Enkelinnen.elements();enum2.hasMoreElements();) { Enkelin enkelin = (Enkelin) enum2.nextElement(); enkelin.center = blumenStiel; computeGrandDaughtersRectangle(enkelin,fm); getNiceNonIntersectingRc4GrandDaughter(tochter.rc,enkelin.rc,dim,isFirstGrDa); enkelin.center.x = enkelin.rc.x+(enkelin.rc.width/2); enkelin.center.y = enkelin.rc.y+(enkelin.rc.height/2); drawTheGrandDaughter(g,enkelin,dColor,EnkelinFont,fm,tochter.center,true,false); isFirstGrDa = false; } anyEnkelinPressed = false; // Nur Knoten for (Enumeration enum3 = tochter.Enkelinnen.elements();enum3.hasMoreElements();) { Enkelin enkelin = (Enkelin) enum3.nextElement(); enkelin.center.x = enkelin.rc.x+(enkelin.rc.width/2); enkelin.center.y = enkelin.rc.y+(enkelin.rc.height/2); if (enkelin.mouseOnMe) { drawTheGrandDaughter(g,enkelin,dColor,EnkelinFont,fm,tochter.center,false,true); drawMyExplanation.refillElements(enkelin.label,enkelin.explanation,enkelin.rc,enkelin.center,enkelin.mouseOnMe); anyEnkelinPressed = true; } else { drawTheGrandDaughter(g,enkelin,dColor,EnkelinFont,fm,tochter.center,false,false); } } fm = getFontMetrics(TochterFont); drawTheDaughter(g,tochter,dColor,TochterFont,fm,true); drawTheMother(g,standardAbgetoentesWeiss,MutterFont); } if (anyEnkelinPressed) { drawExplanation(drawMyExplanation,g); } } } private void computeTheMother() { FontMetrics fm = getFontMetrics(MutterFont); dieMutter.rc.width = fm.stringWidth(dieMutter.label) + 10; dieMutter.rc.height = fm.getHeight() + 4; dieMutter.rc.x = dieMutter.center.x - dieMutter.rc.width/2; dieMutter.rc.y = dieMutter.center.y - dieMutter.rc.height/2; } private void drawTheMother(Graphics g,Color color,Font font) { FontMetrics fm; g.setFont(font); fm = getFontMetrics(font); dieMutter.rc.width = fm.stringWidth(dieMutter.label) + 10; dieMutter.rc.height = fm.getHeight() + 4; dieMutter.rc.x = dieMutter.center.x - dieMutter.rc.width/2; dieMutter.rc.y = dieMutter.center.y - dieMutter.rc.height/2; g.setColor(color); g.fillRect(dieMutter.rc.x,dieMutter.rc.y,dieMutter.rc.width,dieMutter.rc.height); Point leftTop = new Point(dieMutter.rc.x,dieMutter.rc.y); Point rightBottom = new Point(dieMutter.rc.x+(dieMutter.rc.width-1),dieMutter.rc.y+(dieMutter.rc.height-1)); //g.drawRect(dieMutter.rc.x,dieMutter.rc.y,dieMutter.rc.width-1,dieMutter.rc.height-1); g.setColor(Color.darkGray); g.drawLine(leftTop.x,rightBottom.y,leftTop.x,leftTop.y); g.drawLine(leftTop.x,leftTop.y,rightBottom.x,leftTop.y); g.setColor(standardAbgetoentesWeiss); g.drawLine(leftTop.x+1,rightBottom.y,rightBottom.x,rightBottom.y); g.drawLine(rightBottom.x,rightBottom.y,rightBottom.x,leftTop.y+1); g.setColor(Color.black); g.drawString(dieMutter.label, dieMutter.center.x - (dieMutter.rc.width-10)/2, (dieMutter.center.y - (dieMutter.rc.height-4)/2) + fm.getAscent()); } private void computeDaughtersRectangle(Tochter tochter,FontMetrics fm) { tochter.rc.width = fm.stringWidth(tochter.label) + 10; tochter.rc.height = fm.getHeight() + 4; tochter.rc.x = tochter.center.x - tochter.rc.width/2; tochter.rc.y = tochter.center.y - tochter.rc.height/2; } private void computeGrandDaughtersRectangle(Enkelin enkelin,FontMetrics fm) { enkelin.rc.width = fm.stringWidth(enkelin.label) + 10; enkelin.rc.height = fm.getHeight() + 4; enkelin.rc.x = enkelin.center.x - enkelin.rc.width/2; enkelin.rc.y = enkelin.center.y - enkelin.rc.height/2; } private void drawTheDaughter(Graphics g,Tochter tochter,Color color,Font font,FontMetrics fm,boolean pressed) { g.setColor(color); g.drawLine(dieMutter.center.x,dieMutter.center.y,tochter.center.x,tochter.center.y); g.fillRect(tochter.rc.x,tochter.rc.y,tochter.rc.width,tochter.rc.height); g.setColor(Color.black); //g.drawRect(tochter.rc.x,tochter.rc.y,tochter.rc.width-1,tochter.rc.height-1); Point leftTop = new Point(tochter.rc.x,tochter.rc.y); Point rightBottom = new Point(tochter.rc.x+(tochter.rc.width-1),tochter.rc.y+(tochter.rc.height-1)); if (!pressed) g.setColor(standardAbgetoentesWeiss); else g.setColor(Color.darkGray); g.drawLine(leftTop.x,rightBottom.y,leftTop.x,leftTop.y); g.drawLine(leftTop.x,leftTop.y,rightBottom.x,leftTop.y); if (!pressed) g.setColor(Color.darkGray); else g.setColor(standardAbgetoentesWeiss); g.drawLine(leftTop.x+1,rightBottom.y,rightBottom.x,rightBottom.y); if (!pressed) g.drawLine(rightBottom.x,rightBottom.y,rightBottom.x,leftTop.y); else g.drawLine(rightBottom.x,rightBottom.y,rightBottom.x,leftTop.y+1); g.setColor(Color.black); g.setFont(font); g.drawString(tochter.label, tochter.center.x - (tochter.rc.width-10)/2, (tochter.center.y - (tochter.rc.height-4)/2) + fm.getAscent()); } private void drawTheGrandDaughter(Graphics g,Enkelin enkelin,Color color,Font font,FontMetrics fm,Point ach,boolean onlyLines,boolean pressed) { g.setColor(color); if (onlyLines) { g.drawLine(ach.x,ach.y,enkelin.center.x,enkelin.center.y); } else { g.fillRect(enkelin.rc.x,enkelin.rc.y,enkelin.rc.width,enkelin.rc.height); Point leftTop = new Point(enkelin.rc.x,enkelin.rc.y); Point rightBottom = new Point(enkelin.rc.x+(enkelin.rc.width-1),enkelin.rc.y+(enkelin.rc.height-1)); if (!pressed) g.setColor(standardAbgetoentesWeiss); else g.setColor(Color.darkGray); g.drawLine(leftTop.x,rightBottom.y,leftTop.x,leftTop.y); g.drawLine(leftTop.x,leftTop.y,rightBottom.x,leftTop.y); if (!pressed) g.setColor(Color.darkGray); else g.setColor(standardAbgetoentesWeiss); g.drawLine(leftTop.x+1,rightBottom.y,rightBottom.x,rightBottom.y); if (!pressed) g.drawLine(rightBottom.x,rightBottom.y,rightBottom.x,leftTop.y); else g.drawLine(rightBottom.x,rightBottom.y,rightBottom.x,leftTop.y+1); g.setColor(Color.black); //g.drawRect(enkelin.rc.x,enkelin.rc.y,enkelin.rc.width-1,enkelin.rc.height-1); g.setFont(font); g.drawString(enkelin.label, enkelin.center.x - (enkelin.rc.width-10)/2, (enkelin.center.y - (enkelin.rc.height-4)/2) + fm.getAscent()); } } private void drawExplanation(Enkelin owningGd,Graphics g) { int xPoints[] = new int[7]; int yPoints[] = new int[7]; Dimension dim = size(); FontMetrics fm = getFontMetrics(TochterFont); Rectangle rc = new Rectangle(); int myXCenter = owningGd.rc.x + owningGd.rc.width/2; rc.width = fm.stringWidth(owningGd.explanation)+10; rc.height = fm.getHeight()+4; g.setFont(TochterFont); g.setColor(Color.white); if (myXCenter < dim.width/2) // Links von der Mitte { rc.x = owningGd.rc.x+owningGd.rc.width+25; rc.y = owningGd.center.y - owningGd.rc.height/2; xPoints[0] = rc.x-29; yPoints[0] = owningGd.center.y; xPoints[1] = rc.x; yPoints[1] = rc.y+rc.height/3; xPoints[2] = rc.x; yPoints[2] = rc.y; xPoints[3] = rc.x+rc.width; yPoints[3] = rc.y; xPoints[4] = xPoints[3]; yPoints[4] = rc.y+rc.height; xPoints[5] = rc.x; yPoints[5] = yPoints[4]; xPoints[6] = rc.x; yPoints[6] = yPoints[5]-rc.height/3; } else // Rechts von der Mitte { rc.x = owningGd.rc.x-rc.width-25; rc.y = owningGd.center.y - owningGd.rc.height/2; xPoints[0] = rc.x+rc.width+29; yPoints[0] = owningGd.center.y; xPoints[1] = rc.x+rc.width; yPoints[1] = rc.y+rc.height/3; xPoints[2] = xPoints[1]; yPoints[2] = rc.y; xPoints[3] = rc.x; yPoints[3] = rc.y; xPoints[4] = xPoints[3]; yPoints[4] = rc.y+rc.height; xPoints[5] = xPoints[1]; yPoints[5] = yPoints[4]; xPoints[6] = xPoints[1]; yPoints[6] = yPoints[5]-rc.height/3; } g.fillPolygon(xPoints,yPoints,7); g.setColor(Color.black); g.drawString(owningGd.explanation,rc.x+5,rc.y+2+fm.getAscent()); g.setColor(Color.gray); g.drawPolygon(xPoints,yPoints,7); } private void getNiceContinuation(Point cnt,Point anchor,Dimension bounds) { Dimension smallerBounds = new Dimension(bounds.width-50,bounds.height-50); int deltaX = Math.abs(cnt.x - anchor.x); int deltaY = Math.abs(cnt.y - anchor.y); if (cnt.x < anchor.x) cnt.x -= deltaX; else if (cnt.x > anchor.x) cnt.x += deltaX; if (cnt.y < anchor.y) cnt.y -= deltaY; else if (cnt.y > anchor.y) cnt.y += deltaY; while (cnt.x < 50) cnt.x++; while (cnt.x > smallerBounds.width) cnt.x--; while (cnt.y < 50) cnt.y++; while (cnt.y > smallerBounds.height) cnt.y--; } // Die Methode start() wird aufgerufen, wenn die Seite, die das Applet enthält, // erstmals auf dem Bildschirm erscheint. Die Startimplementierung des Applet-Assistenten // dieser Methode startet die Ausführung des Threads des Applets. //-------------------------------------------------------------------------- public void start() { setBackground(backgroundColor); } // Die Methode stop() wird aufgerufen, wenn die Seite, die das Applet enthält, // nicht mehr auf dem Bildschirm angezeigt wird. Die Startimplementierung des Applet-Assistenten // dieser Methode beendet die Ausführung des Threads des Applets. //-------------------------------------------------------------------------- public void stop() { } // MAUS-UNTERSTÜTZUNG: // Die Methode mouseDown() wird aufgerufen, wenn die Maustaste gedrückt wird, // während sich der Mauszeiger über dem Applet befindet. //-------------------------------------------------------------------------- public boolean mouseDown(Event evt, int x, int y) { boolean hitsSomething = false; // Töchter geben nur ein drip-Geräusch von sich for (Enumeration enum = dieMutter.Toechter.elements();enum.hasMoreElements();) { Tochter tochter = (Tochter) enum.nextElement(); if (tochter.mouseOnMe) // Nur der geöffnete Zweig ist interessant { for (Enumeration enum2 = tochter.Enkelinnen.elements();enum2.hasMoreElements();) { Enkelin enkelin = (Enkelin) enum2.nextElement(); if (enkelin.rc.inside(x,y)) { hitsSomething = true; try { URL url = getDocumentBase(); URL completeURL = new URL(url,enkelin.theURL); getAppletContext().showDocument(completeURL,enkelin.howToOpen); } catch (MalformedURLException e) { play(getCodeBase(),"audio/gong.au"); } } } } } if (!hitsSomething) { play(getCodeBase(),"audio/drip.au"); } return true; } // MAUS-UNTERSTÜTZUNG: // Die Methode mouseUp() wird aufgerufen, wenn die Maustaste losgelassen wird, // während sich der Mauszeiger über dem Applet befindet. //-------------------------------------------------------------------------- public boolean mouseUp(Event evt, int x, int y) { return true; } public boolean mouseMove(Event evt, int x, int y) { if (dieMutter.mouseEnteredTochter(x,y) || dieMutter.mouseEnteredEnkelin(x,y)) // Maus auf neuem Tochterknoten { play(getCodeBase(),"audio/drop.au"); repaint(); } return true; } // MAUS-UNTERSTÜTZUNG: // Die Methode mouseEnter() wird aufgerufen, wenn der Mauszeiger den // Bereich des Applets erreicht //-------------------------------------------------------------------------- public boolean mouseEnter(Event evt, int x, int y) { // ZU ERLEDIGEN: Platzieren Sie hier den Applet-Code für mouseEnter return true; } // MAUS-UNTERSTÜTZUNG: // Die Methode mouseEnter() wird aufgerufen, wenn der Mauszeiger den Bereich des Applets verlässt // Bereich des Applets erreicht //-------------------------------------------------------------------------- public boolean mouseExit(Event evt, int x, int y) { // ZU ERLEDIGEN: Platzieren Sie hier den Applet-Code für mouseExit return true; } private void getNiceNonIntersectingRc(Rectangle refRc,Rectangle oldRc) { Rectangle newRc = new Rectangle(oldRc.x,oldRc.y,oldRc.width,oldRc.height); Dimension dim = size(); Rectangle area = new Rectangle(0,0,dim.width,dim.height); newRc.grow(2,2); oldRc.grow(2,2); while (newRc.intersects(oldRc)) { int quarter = inWhichQuarterOfArea(newRc,area); switch (quarter) { case 1: // links oben newRc.translate(3,-1); // nach nach rechts oben verschieben break; case 2: // rechts oben newRc.translate(3,1); // nach rechts unten verschieben break; case 3: // rechts unten newRc.translate(-3,1); // nach links unten verschieben break; case 4: // links unten newRc.translate(-3,-1); // nach links oben verschieben break; } } newRc.grow(-2,-2); oldRc.reshape(newRc.x,newRc.y,newRc.width,newRc.height); } private void getNiceNonIntersectingRc4GrandDaughter(Rectangle refRc,Rectangle oldRc,Dimension dim,boolean dd) { if (!dd) // direct draw { Rectangle newRc = new Rectangle(oldRc.x,oldRc.y,oldRc.width,oldRc.height); Rectangle area = new Rectangle(0,0,dim.width,dim.height); int trials; // Repositionierversuche newRc.grow(1,1); oldRc.grow(1,1); trials = 1; while (newRc.intersects(oldRc) && trials < 100) { trials++; int quarter = inWhichQuarterOfArea(newRc,area); switch (quarter) { case 1: // links oben newRc.translate(1,-1); // nach nach rechts oben verschieben break; case 2: // rechts oben newRc.translate(-1,-1); // nach links oben verschieben break; case 3: // rechts unten newRc.translate(-1,1); // nach rechts unten verschieben break; case 4: // links unten newRc.translate(1,1); // nach rechts unten verschieben break; } } newRc.grow(-1,-1); oldRc.reshape(newRc.x,newRc.y,newRc.width,newRc.height); } } private int inWhichQuarterOfArea(Rectangle rc,Rectangle frame) { Rectangle rechtsOben = new Rectangle(frame.width/2,frame.y,frame.width/2,frame.height/2); Rectangle rechtsUnten = new Rectangle(frame.width/2,frame.height/2,frame.width/2,frame.height/2); Rectangle linksUnten = new Rectangle(frame.x,frame.height/2,frame.width/2,frame.height/2); Point center = new Point(rc.x+rc.width/2,rc.y+rc.height/2); // Die Reihenfolge ist wichtig! if (rechtsOben.inside(center.x,center.y)) { return 2; } else if (rechtsUnten.inside(center.x,center.y)) { return 3; } else if (linksUnten.inside(center.x,center.y)) { return 4; } else { return 1; } }