view src/samer/core_/shells/DesktopShell.java @ 0:bf79fb79ee13

Initial Mercurial check in.
author samer
date Tue, 17 Jan 2012 17:50:20 +0000
parents
children
line wrap: on
line source
/*
 *	AppShell.java
 *
 *	Copyright (c) 2000, Samer Abdallah, King's College London.
 *	All rights reserved.
 *
 *	This software is provided AS iS and WITHOUT ANY WARRANTY;
 *	without even the implied warranty of MERCHANTABILITY or
 *	FITNESS FOR A PARTICULAR PURPOSE.
 */

package samer.core.shells;

import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.util.*;

import samer.core.*;
import samer.core.util.shell.*;
import samer.core.util.*;
import samer.core.util.swing.*;
import samer.core.util.swing.Frame;
import samer.core.util.swing.Console;
import samer.core.util.swing.Dialog;
import samer.core.NumberViewer;
import samer.core.viewers.swing.*;
import samer.core.types.*;

import javax.swing.*;
import javax.swing.event.*;

public class DesktopShell extends AppShellBase
{
	public DesktopShell() { this(getDefaultPropertiesFile());	}
	public DesktopShell(String props) {
		super(props);
		Shell.setShell(this);

		desktop = new JDesktopPane();
		desktop.setDragMode(JDesktopPane.LIVE_DRAG_MODE);
		mainFrame = new Frame("Desktop");
		mainFrame.container().setLayout(new BorderLayout());
		mainFrame.container().add(desktop);
		mainFrame.expose();
		mainFrame.addWindowListener( new WindowAdapter() {
			public void windowClosing(WindowEvent e) { Shell.exit(); }
		} );

		InternalFrame.setDesktop(desktop);

//		con   = new Console();
//		confr = new InternalFrame("console.frame");
//		JScrollPane scroller = new JScrollPane(con);

//		JComponent jc=new javax.swing.JPanel();
//		jc.setBorder(BorderFactory.createEmptyBorder(1,1,1,1));
//		jc.setLayout( new BorderLayout(4,5));
//		jc.add(scroller);
//		jc.add(new CommandField(20), "South");
		//confr.container().add(jc);
//		confr.setContentPane(jc);
//		confr.pack();
//		confr.expose();

		Shell.registerAgent(this);
//		Shell.registerAgent(con);

		// javax.swing.JPopupMenu.setDefaultLightWeightPopupEnabled(false);

		put(VDouble.class,DoubleViewer.class);
		put(VInteger.class,IntegerViewer.class);
		put(VBoolean.class,BooleanViewer.class);
		put(VString.class,StringViewer.class);
		put(VParameter.class,ParameterViewer.class);
		put(VFile.class,FileViewer.class);
		put(VColor.class,ColorButton.class);
		put(Variable.class,StringViewer.class);
		put(Viewable.class,DefaultViewer.class);

		try { execute("run",Shell.env()); }
		catch (Exception ex) { Shell.trace(ex.toString()); }
	}

	class VContainer extends InternalFrameAdapter implements ViewableManager.ViewerContainer
	{
		InternalFrame	frame;
		Box				box;
		Component		glue;

		VContainer()
		{
			frame = new InternalFrame("exposed");
			box   = Box.createVerticalBox();
			glue  = Box.createVerticalGlue();

			JScrollPane scr=new JScrollPane(box);
			scr.setBorder(null);

			box.add(glue);
			frame.container().add(scr);
			frame.pack();
			frame.expose();
			frame.setClosable(true);
			frame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
			frame.addInternalFrameListener(this);
		}

		public void removeAll() { box.removeAll(); }
		public void add(java.util.Iterator components)
		{
			box.remove(glue);
			while (components.hasNext()) {
				box.add((Component)(components.next()));
			}
			box.add(glue);
			box.validate();
			frame.pack();
		}

		public void internalFrameClosing(InternalFrameEvent e) {
			Shell.print("internal frame closing");
			vm.releaseViewerContainer();
			frame.dispose();
		}
	}

	public ViewableManager.ViewerContainer getViewerContainer() {
		return new VContainer();
	}

	// ............. Factory methods ............

	public Shell.Window getWindow(String title) { return new InternalFrame(title); }
	public Shell.Dialog getDialog(String title) { return new Dialog(mainFrame,title,true); }

	public Component createLabel(String txt) { return new JLabel(txt); }
	public Viewer    createViewerPanel(Viewer vwr) { return new VPanel(vwr); }
	public Container createButtonsFor(Agent agent)
	{
		ButtonBar bbar=new ButtonBar();
		bbar.setTarget(agent);
		agent.getCommands( bbar);
		return bbar;
	}

	public NumberViewer createNumberViewer(String label, int flags, NumberSink s) {
		return new TextualNumberViewer(label);
	}

	public void exposeCommands( Agent agent)
	{
		if (buttonBar==null) {
			buttonBar = new ButtonBar();
			buttonBar.setBroadcaster(am.getBroadcaster());
			mainFrame.container().add( buttonBar, "North");
		}

		buttonBar.setTarget(agent);
		agent.getCommands(buttonBar);
		mainFrame.validate();
	}

	// .......... Message printing ..............

	public void print(String msg) { System.out.println(msg); }
	public void status(String msg) { System.out.println(msg); }

	private PrintWriter writer=null;
	public PrintWriter getPrintWriter()
	{
		if (writer==null)
			writer = new PrintWriter( new OutputStreamWriter(System.out));
		return writer;
	};
/*
	public PrintWriter getPrintWriter() {
		return new PrintWriter(con.getWriter(),true);
	}

	public void print(String msg) { con.write(msg); con.write("\n"); }
	public void status(String msg) { con.write(msg); con.write("\n"); }
 */

	// ............... Private bits .............

	private Frame			mainFrame;
	private JDesktopPane	desktop;
	private InternalFrame	confr=null;
	private Console			con=null;
	private ButtonBar		buttonBar=null;
	private Component		glue;

	public static void main( String args[]) { new DesktopShell(); }
}