import java.applet.Applet;
import java.awt.*;
import java.io.*;
import java.net.*;
import java.util.Enumeration;
public class visual extends Applet implements Runnable {
Panel containerPanel,listPanel,textPanel,ptext;
Panel centerPanel,lcenterPanel,bottomPanel,lbottomPanel;
Label lab;
TextArea t;
TextField Title;
Button but_URL,but_next, but_news, but_guide,but_return;
Component [] components;
Button but_quick[];
Thread newsBox=null;
Clips Campus_Clips[];
int Clips_index,N_Clips;
String Clip_Font,Blanks;
String chooserLink[];
URL URLLink[];
boolean first_news,first_guide,news_alert;
int istep;
Color umsl_red;
Color umsl_yellow;
public void init() {
istep=7;
but_quick=new Button[11];
chooserLink = new String[20];
URLLink = new URL[20];
first_news=true;
first_guide=true;
news_alert=false;
Blanks = " ";
Clips_index=0;
String par =getParameter("nclips");
N_Clips=(par ==null)?2:Integer.parseInt(par);
par = getParameter("news_alert");
if(par.equals("yes")){news_alert=true;}
par = getParameter("thefont");
// System.out.println(par);
Clip_Font=(par==null)?"TimeRoman":par;
// System.out.println(par);
Campus_Clips= new Clips[N_Clips];
par = getParameter("news0");
Campus_Clips[0]=new Clips(par,20," Campus Web Guide","Show Guide ","Visit This Page" );
par= getParameter("news1");
Campus_Clips[1]=new Clips(par,20," Campus News ","Show News "," More Details " );
// Now we build the Applet Layout begining with Fonts and Colors
Font fnt24 =new Font(Clip_Font,Font.BOLD,24);
Font fnt18 = new Font(Clip_Font,Font.BOLD,18);
Font fnt14 = new Font(Clip_Font,Font.BOLD,14);
Font fnt14p = new Font(Clip_Font,Font.PLAIN,14);
umsl_red=new Color(200,61,61);
umsl_yellow=new Color(240,180,60);
// First create two panels, one for the quick-buttons, one for the text window.
listPanel =new Panel();
listPanel.setName("listPanel");
lcenterPanel = new Panel();
lcenterPanel.setName("lcenterPanel");
lbottomPanel = new Panel();
lbottomPanel.setName("lbottomPanel");
textPanel = new Panel();
textPanel.setName("textPanel");
bottomPanel = new Panel();
bottomPanel.setName("bottomPanel");
centerPanel = new Panel();
centerPanel.setName("centerPanel");
//Where to put them
containerPanel = new Panel();
containerPanel.setName("containerPanel");
//containerPanel.setBackground(Color.lightGray);
//containerPanel.setForeground(Color.black);
//Now the whole show, "The Applet panel"
setLayout(new BorderLayout());
setForeground(umsl_red);
setBackground(umsl_yellow);
add("South",containerPanel);
lab = new Label("The Campus Information Kiosk",Label.CENTER) ;
lab.setFont(fnt18);
lab.setName("lab");
add("North",lab );
Title=new TextField(20);
Title.setName("Title");
Panel ptext =new Panel();
ptext.setName("ptext");
ptext.setLayout(new FlowLayout(FlowLayout.CENTER));
Title.setEditable(false);
Title.setForeground(Color.black);
Title.setBackground(Color.lightGray);
Title.setFont(fnt14);
ptext.add(Title);
add("Center",ptext);
containerPanel.setLayout(new CardLayout());
containerPanel.add("lists",listPanel);
containerPanel.add("text", textPanel);
// Lay out the textPanel with button panel on bottom and the rest for text.
textPanel.setLayout(new BorderLayout());
textPanel.add("South", bottomPanel);
textPanel.add("Center", centerPanel);
// put the buttons on the panels, with labels.
bottomPanel.setFont(fnt14);
but_next=new Button("Next Entry");
but_next.setName("but_next");
but_next.setBackground(Color.lightGray);
//umsl_red still in Foreground
but_URL= new Button(Campus_Clips[Clips_index].URLLink()) ;
but_URL.setName("but_URL");
but_URL.setBackground(Color.lightGray);
but_return=new Button("Return to Main Menu");
but_return.setBackground(Color.lightGray);
but_return.setName("but_return");
bottomPanel.setLayout(new FlowLayout(FlowLayout.CENTER));
bottomPanel.add(but_next);
bottomPanel.add(but_URL);
bottomPanel.add(but_return);
// Build the centerPanel
centerPanel.setLayout(new FlowLayout(FlowLayout.CENTER));
t= new TextArea("TextArea", 5, 70);
t.setName("t");
t.setEditable(false);
t.setForeground(Color.black);
t.setBackground(Color.white);
t.setFont(fnt14);
centerPanel.add( t);
// Lay out the listPanel.
listPanel.setLayout(new BorderLayout());
listPanel.add("South", lbottomPanel);
listPanel.add("Center", lcenterPanel);
lcenterPanel.setLayout(new GridLayout(2,5));
lcenterPanel.setFont(fnt14);
lcenterPanel.setForeground(Color.blue);
but_news=new Button("Campus News");
but_news.setName("but_news");
but_news.setBackground(Color.lightGray);
but_guide=new Button("Campus Web Guide");
but_guide.setName("but_guide");
but_guide.setBackground(Color.lightGray);
lbottomPanel.setLayout(new FlowLayout(FlowLayout.CENTER));
lbottomPanel.setFont(fnt14);
lbottomPanel.add(but_news);
lbottomPanel.add(but_guide);
but_quick[0]= new Button("Directory");
chooserLink[0]=new String("http://www.umsl.edu/depts/depts.html");
but_quick[1]=new Button("Events");
chooserLink[1]=new String("http://www.umsl.edu/studentlife/dsa/calcamev.html");
but_quick[2]=new Button("Academic Areas");
chooserLink[2]=new String("http://www.umsl.edu/curriculum/curriculum.html");
but_quick[10]=new Button("Administration");
chooserLink[10]=new String("http://www.umsl.edu/curriculum/curriculum.html");
but_quick[3]=new Button("Computing");
chooserLink[3]=new String("http://www.umsl.edu/services/computing/computing.html");
but_quick[4]=new Button("Faculty");
chooserLink[4]=new String("http://www.umsl.edu/faculty/faculty.html");
but_quick[5]=new Button("Library");
chooserLink[5]=new String("http://www.umsl.edu/services/library/library.html");
but_quick[6]=new Button("Service");
chooserLink[6]=new String("http://www.umsl.edu/services/services.html");
but_quick[7]=new Button("Student Life");
chooserLink[7]=new String("http://www.umsl.edu/studentlife/student.html");
but_quick[8]=new Button("Web Help");
chooserLink[8]=new String("http://www.umsl.edu/help/htmlhelp.html");
but_quick[9]=new Button("Whats New");
chooserLink[9]=new String("http://www.umsl.edu/misc/whatsnew.html");
int j;
for(j=0;j< 10;j++){
try{URLLink[j]= new URL(chooserLink[j]);}
catch (MalformedURLException e)
{URLLink[j]=null;}
but_quick[j].setBackground(Color.lightGray);
lcenterPanel.add(but_quick[j]);
}
components=new Component[9];
components[0]=but_news;
components[1]=but_guide;
components[2]=lbottomPanel;
components[3]=lcenterPanel;
components[4]=listPanel;
components[5]=containerPanel;
components[6]=ptext;
components[7]=lab;
// is there a news alert?
if(news_alert){
boolean testit;
( (CardLayout)(containerPanel.getLayout())).next(containerPanel);
Clips_index=1;
testit=Campus_Clips[Clips_index].load_clip(t);
if(testit){but_URL.setLabel(Campus_Clips[Clips_index].URLLink());}
else {but_URL.setLabel("No Link Available");}
first_news=false;
Title.setText(Campus_Clips[Clips_index].Clip_Title());
}else{
Title.setText(" Main Menu "); }
}
public void start(){
// run this as a new thread
if(newsBox==null){
newsBox= new Thread(this);
newsBox.start();
}
}
public void run(){
// Nothing! everything is event driven
while(true){
try {Thread.currentThread().sleep(4000);} catch (InterruptedException e){}
}
}
public void stop(){
if ( newsBox != null) {
newsBox.stop();
newsBox = null;
}
}
public boolean action(Event evt, Object obj) {
int button_type=0;
boolean testit;
int choice_index;
if (evt.target instanceof Button) {
int k;
for(k=0;k< 11;k++){
if(evt.target==but_quick[k]){
this.getAppletContext().showDocument(URLLink[k]);}
}
if(evt.target==but_next){button_type=0;};
if(evt.target==but_URL){button_type=1;};
if(evt.target==but_guide){button_type=2;};
if(evt.target==but_news){button_type=3;}
if(evt.target==but_return){button_type=4;}
switch(button_type){
case 0:
testit=Campus_Clips[Clips_index].load_clip(t);
if(testit){but_URL.setLabel(Campus_Clips[Clips_index].URLLink());}
else {but_URL.setLabel("No Link Available");}
break;
case 1:
this.getAppletContext().showDocument(Campus_Clips[Clips_index].clip_URL());
break;
case 2:
( (CardLayout)(containerPanel.getLayout())).next(containerPanel);
if((first_guide==true)||(Clips_index==1)){
Clips_index=0;
testit=Campus_Clips[Clips_index].load_clip(t);
if(testit){but_URL.setLabel(Campus_Clips[Clips_index].URLLink());}
else {but_URL.setLabel("No Link Available");}
first_guide=false;
}
Title.setText(Campus_Clips[Clips_index].Clip_Title());
break;
case 3:
( (CardLayout)(containerPanel.getLayout())).next(containerPanel);
if((first_news==true)||(Clips_index==0)){
Clips_index=1;
testit=Campus_Clips[Clips_index].load_clip(t);
if(testit){but_URL.setLabel(Campus_Clips[Clips_index].URLLink());}
else {but_URL.setLabel("No Link Available");}
first_news=false;
}
Title.setText(Campus_Clips[Clips_index].Clip_Title());
break;
case 4:
( (CardLayout)(containerPanel.getLayout())).next(containerPanel);
Title.setText(" Main Menu ");
break;
}
}
return true;
}
public void clearit(){
int ihide=0;
for( ihide=0;ihide< 8;ihide++){
components[ihide].hide();
((vbutton)(getAppletContext().getApplet("vbutton"))).which_component(components[ihide].getName());
try {Thread.currentThread().sleep(2000);}
catch (InterruptedException e){}
}
}
public void step(){
if(istep> =0){
((vbutton)(getAppletContext().getApplet("vbutton"))).which_component(components[istep].getName());
components[istep--].show();
}
}
}//end of class
/* The class Clips provides an interface to a file of clips to be displayed
in the layout The Clips may or may not have a link attached.
The idea is to create a compromise between the screen real estate limitation and
the need for informative descriptions of what is being linked to.
The expected format of a Clips-file is (< clip> ]< URL possibly empty> ])+ . As it
stands ] cannot be used in a clip or URL. (I have always escaped new-lines and tabs
\n,\t I am not sure I need to)
Here is the public Interface.
public Clips(String s,int count, String titl, String next_b)
s is the URL of the Clips-file
count is larger than the number of Clips entries in the file.
titl, next_b, are three strings probably to be used for labels. A Title,
and link_l a "to" label, and a "from" lable.
public boolean test_clip(){return goodRead;}
public String Clip_Title(){return title;}
public String Next_Label(){return next_button;}
public String URLLink(){return link_label;}
public boolean load_clip(TextArea t,int i){return testURL; }
this loads a specific clip the i refers to the order in the
clip file..starting with 1. This is not a well developed interface.
the method returns true if associated URL false if not.
public boolean load_clip(TextArea t){return testURL; }
this loads the next clip in sequence. Return as above.
public URL clip_URL(){return news_URL);}
this returns the URL associated with a clip.
*/
class Clips {
int count;
byte ascii[];
boolean goodRead =true;
boolean isURL;
String news_file=null;
int news_top;
URL news_URL;
InputStream iStream;
DataInputStream dStream;
StringBuffer str ;
StringBuffer ubuf ;
String clips[];
URL URLs[];
int clip_size[];
int next_clip;
String title,next_button,link_label,Blanks20;
public Clips(String s,int count, String titl, String next_b,String link_l){
Blanks20=" ";
ascii = new byte[280];
URLs = new URL[count];
clips = new String[count];
clip_size = new int[count];
// str = new StringBuffer(200);
//ubuf = new StringBuffer(50);
title=new String(titl);
link_label= new String(link_l);
next_button=new String(next_b);
//First we try to get a DataInputStream
goodRead =true;
news_file = s;
try{news_URL= new URL(news_file);}
catch (MalformedURLException e)
{goodRead=false;}
//System.out.println("after URL"+news_file);
if(goodRead){
try{iStream= news_URL.openStream();}
catch (IOException e)
{goodRead=false;}
catch(NullPointerException e)
{goodRead=false;}
}
// System.out.println("After openStream");
if(goodRead){
dStream = new DataInputStream(iStream);
}
/* At this point it is not clear we can read from it( is file readable?)
I think that all we have accomplished is made byte reading available*/
//We now start to fill the string buffers from the input stream beginning
//with the dummy headline
clips[0]= new String("There are no additional clips in this file. \nPress \"Next\" to recycle clips.");
clip_size[0]=76;
// try{URLs[0]= new URL("http://www.umsl.edu/index.html"); }
// catch (MalformedURLException e) {};
URLs[0]=null;
news_top=1; //where real news begins
next_clip=1; //assume something there
if(goodRead){
byte testbyte=0x20;
boolean more_bytes=true;
try{testbyte= dStream.readByte();}
catch (IOException e){more_bytes = false;}
while(more_bytes){
count = 0;
//str = new StringBuffer();
//ubuf = new StringBuffer();
if(testbyte==']'){break;}
//str.append((char)testbyte);
ascii[count++]=testbyte;
while(testbyte!=']'){
try{testbyte= dStream.readByte();}
catch (IOException e){more_bytes = false;
testbyte=']';}
if(testbyte!=']'){
//str.append((char)testbyte);
ascii[count++]=testbyte;
}
}
clips[news_top]=new String(ascii,0,0,count);
clip_size[news_top]=count;
count=0;
try{testbyte= dStream.readByte();}
catch (IOException e){more_bytes = false;
testbyte=']';}
if(testbyte==']'){
URLs[news_top]=null;
}else{
// ubuf.append((char)testbyte);
ascii[count++]=testbyte;
while(testbyte!=']'){
try{testbyte= dStream.readByte();}
catch (IOException e){more_bytes = false;
testbyte=']'; }
if(testbyte!=']'){
// ubuf.append((char)testbyte);
ascii[count++]=testbyte;
}
}
}
//System.out.println(ubuf.toString());
// try{URLs[news_top]=new URL(ubuf.toString());}
try{URLs[news_top]=new URL(new String(ascii,0,0,count));}
catch (MalformedURLException e)
{URLs[news_top]=null;}
try{testbyte= dStream.readByte();}
catch (IOException e){more_bytes = false;};
// System.out.println(clips[news_top]);
if(testbyte=='['){more_bytes=false;}
news_top++; //always one more
}//clearing buffer with while
}
}
public boolean test_clip(){return goodRead;}
public String Clip_Title(){return title;}
public String Next_Label(){return next_button;}
public String URLLink(){return link_label;}
public boolean load_clip(TextArea t,int i){
boolean testURL;
next_clip=(news_top< =i)?0:i;
for(int j=0;j< 14;j++){
t.replaceText(Blanks20,j*20,(j*20)+19);}
t.replaceText(clips[next_clip],0,clip_size[next_clip]);
System.out.println(clip_size[next_clip]);
if(URLs[next_clip]!=null){
news_URL= URLs[next_clip];
testURL=true;
}else{
testURL=false;
}
next_clip++;
return (testURL);
}
public boolean load_clip(TextArea t){
boolean testURL;
if(next_clip==news_top){next_clip=0; }
for(int j=0;j< 14;j++){
t.replaceText(Blanks20,j*20,(j*20)+19);}
t.replaceText(clips[next_clip],0,clip_size[next_clip]);
//System.out.println(clip_size[next_clip]);
if(URLs[next_clip]!=null){
news_URL= URLs[next_clip];
testURL=true;
}else{
testURL=false;
}
next_clip++;
return (testURL);
}
public URL clip_URL(){
return news_URL;
}
}//end of class