1 /**
   2  * MediatorPattern example
   3  * GUI Login
   4  */
   5 
   6 import java.awt.*;
   7 import java.awt.event.*;
   8 
   9 interface Mediator {
  10     public abstract void createColleagues();
  11     public abstract void colleagueChanged(Colleague colleague);
  12 }
  13 
  14 interface Colleague {
  15     public abstract void setMediator(Mediator mediator);
  16     public abstract void setColleagueEnabled(boolean enabled);
  17 }
  18 
  19 class ColleagueButton extends Button implements Colleague {
  20     private Mediator mediator;
  21     public ColleagueButton(String caption) {
  22         super(caption);
  23     }
  24     public void setMediator(Mediator mediator) {
  25         this.mediator = mediator;
  26     }
  27     public void setColleagueEnabled(boolean enabled) {
  28         setEnabled(enabled);
  29     }
  30 }
  31 
  32 class ColleagueTextField extends TextField implements TextListener, Colleague {
  33     private Mediator mediator;
  34     public ColleagueTextField(String text, int columns) {
  35         super(text, columns);
  36     }
  37     public void setMediator(Mediator mediator) {
  38         this.mediator = mediator;
  39     }
  40     public void setColleagueEnabled(boolean enabled) {
  41         setEnabled(enabled);
  42         setBackground(enabled ? Color.white : Color.lightGray);
  43     }
  44     public void textValueChanged(TextEvent e) {
  45         mediator.colleagueChanged(this);
  46     }
  47 }
  48 
  49 class ColleagueCheckbox extends Checkbox implements ItemListener, Colleague {
  50     private Mediator mediator;
  51     public ColleagueCheckbox(String caption, 
  52                              CheckboxGroup group, boolean state) {
  53         super(caption, group, state);
  54     }
  55     public void setMediator(Mediator mediator) {
  56         this.mediator = mediator;
  57     }
  58     public void setColleagueEnabled(boolean enabled) {
  59         setEnabled(enabled);
  60     }
  61     public void itemStateChanged(ItemEvent e) {
  62         mediator.colleagueChanged(this);
  63     }
  64 }
  65 
  66 class LoginFrame extends Frame implements ActionListener, Mediator {
  67     private ColleagueCheckbox checkGuest;
  68     private ColleagueCheckbox checkLogin;
  69     private ColleagueTextField textUser;
  70     private ColleagueTextField textPass;
  71     private ColleagueButton buttonOk;
  72     private ColleagueButton buttonCancel;
  73 
  74     // Constructor: create Colleagues, position, display
  75     public LoginFrame(String title) {
  76         super(title);
  77         setBackground(Color.lightGray);
  78         setLayout(new GridLayout(4,2));
  79 
  80         // create and position
  81         createColleagues();
  82         add(checkGuest);
  83         add(checkLogin);
  84         add(new Label("Username:"));
  85         add(textUser);
  86         add(new Label("Password:"));
  87         add(textPass);
  88         add(buttonOk);
  89         add(buttonCancel);
  90 
  91         // enabled initial setting and display
  92         colleagueChanged(checkGuest);
  93         pack();
  94         show();
  95     }
  96 
  97     public void createColleagues() {
  98         CheckboxGroup g = new CheckboxGroup();
  99         checkGuest = new ColleagueCheckbox("Guest",g,true);
 100         checkLogin = new ColleagueCheckbox("Login",g,false);
 101         textUser = new ColleagueTextField("",10);
 102         textPass = new ColleagueTextField("",10);
 103         textPass.setEchoChar('*');
 104         buttonOk = new ColleagueButton("OK");
 105         buttonCancel = new ColleagueButton("Cancel");
 106 
 107         // Mediator setting
 108         checkGuest.setMediator(this);
 109         checkLogin.setMediator(this);
 110         textUser.setMediator(this);
 111         textPass.setMediator(this);
 112         buttonOk.setMediator(this);
 113         buttonCancel.setMediator(this);
 114 
 115         // Listener setting
 116         checkGuest.addItemListener(checkGuest);
 117         checkLogin.addItemListener(checkLogin);
 118         textUser.addTextListener(textUser);
 119         textPass.addTextListener(textPass);
 120         buttonOk.addActionListener(this);
 121         buttonCancel.addActionListener(this);
 122     }
 123 
 124     public void colleagueChanged(Colleague c) {
 125         if(c == checkGuest || c == checkLogin) {
 126             if(checkGuest.getState()) {   // Guest mode
 127                 textUser.setColleagueEnabled(false);
 128                 textPass.setColleagueEnabled(false);
 129                 buttonOk.setColleagueEnabled(true);
 130             } else {
 131                 textUser.setColleagueEnabled(true);
 132                 userpassChanged();
 133             } 
 134         } else if(c == textUser || c == textPass) {
 135             userpassChanged();
 136         } else {
 137             System.out.println("colleagueChanged:unknown colleague ="+c);
 138         }
 139     }
 140 
 141     private void userpassChanged() {
 142         if(textUser.getText().length() > 0) {
 143             textPass.setColleagueEnabled(true);
 144             if(textPass.getText().length() > 0) {
 145                 buttonOk.setColleagueEnabled(true);
 146             } else {
 147                 buttonOk.setColleagueEnabled(false);
 148             }
 149         } else {
 150             textPass.setColleagueEnabled(false);
 151             buttonOk.setColleagueEnabled(false);
 152         }
 153     }
 154     public void actionPerformed(ActionEvent e) {
 155         System.out.println(""+e);
 156         System.exit(0);
 157     }
 158 }
 159 
 160 public class MediatorGuiLogin {
 161     public static void main(String[] args) {
 162         new LoginFrame("Mediator Sample");
 163     }
 164 }
 165 
 166 
 167 
 168     
 169