日記帳

日記です。

[Java][JavaScript] notepad-js-swing

maven-rhino-compiler-plugin なんてものを作ったのでサンプルアプリケーションとしてメモ帳を作ってみました.

JavaScriptソースコードは続きに.


Java よりは writability が上がるけどクラス名やメソッド名は Java のままなので IDE のサポートなしに書くのは結構大変な気がする.

importPackage(Packages.java.lang)
importPackage(Packages.java.util)
importPackage(Packages.java.text)
importPackage(Packages.java.io)
importPackage(Packages.java.awt)
importPackage(Packages.java.awt.event)
importPackage(Packages.javax.swing)

// message catalog
var messageBundle
try
{
	messageBundle = ResourceBundle.getBundle("say.hello.js.notepad.Messages")
}
catch (e) { }

function _(key)
{
	var value = key
	try
	{
		value = messageBundle.getString(key)
	}
	catch (e) { }
	return value;
}

// application 
var app = {
	_frame : null,
	_menuBar : null,
	_textArea : null,
	_fileChooser : null,
	_filePath : null,

	get filePath()
	{
		return this._filePath;
	},
	set filePath(newFilePath)
	{
		this._filePath = newFilePath;
		this.frame.setTitle(this._filePath + " - " + _("application.title"));
	},
	get fileChooser()
	{
		if (this._fileChooser == null)
		{
			this._fileChooser = new JFileChooser();
		}

		return this._fileChooser;
	},
	get textArea()
	{
		if (this._textArea == null)
		{
			this._textArea = new JTextArea();
		}

		return this._textArea;
	},
	get frame()
	{
		if (this._frame == null)
		{
			this._frame = new JFrame();
			this._frame.title = _("application.title")
			this._frame.defaultCloseOperation = JFrame.EXIT_ON_CLOSE

			// MenuBar
			this._frame.setJMenuBar(this.menuBar)

			// TextArea
			var scrollPane = new JScrollPane(this.textArea)
			scrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS)
			scrollPane.setPreferredSize(new Dimension(500, 400))
			this._frame.add(scrollPane, BorderLayout.CENTER);

			// etc
			this._frame.locationByPlatform = true
			this._frame.pack()
		}
		return this._frame;
	},
	get menuBar()
	{
		var self = this;
		if (this._menuBar == null)
		{
			this._menuBar = new JMenuBar();

			var menuShortcutKeyMask = Toolkit.defaultToolkit.menuShortcutKeyMask

			// File
			var fileMenu = new JMenu(_("File"));
			fileMenu.setMnemonic(KeyEvent.VK_F)
			this._menuBar.add(fileMenu)

			var openMenuItem = new JMenuItem(_("Open"), KeyEvent.VK_O)
			openMenuItem.accelerator = KeyStroke.getKeyStroke(KeyEvent.VK_O, menuShortcutKeyMask)
			openMenuItem.addActionListener(new ActionListener(){
				actionPerformed : function(e) { self.open(); }
			});
			fileMenu.add(openMenuItem);

			var saveMenuItem = new JMenuItem(_("Save"), KeyEvent.VK_S)
			saveMenuItem.accelerator = KeyStroke.getKeyStroke(KeyEvent.VK_S, menuShortcutKeyMask)
			saveMenuItem.addActionListener(new ActionListener(){
				actionPerformed : function(e) { self.save(); }
			});
			fileMenu.add(saveMenuItem);

			var saveAsMenuItem = new JMenuItem(_("SaveAs"), KeyEvent.VK_A)
			saveAsMenuItem.addActionListener(new ActionListener(){
				actionPerformed : function(e) { self.saveAs(); }
			});
			fileMenu.add(saveAsMenuItem);

			fileMenu.addSeparator()

			var exitMenuItem = new JMenuItem(_("Exit"), KeyEvent.VK_X)
			exitMenuItem.addActionListener(new ActionListener(){
				actionPerformed : function(e) { System.exit(0); }
			});
			fileMenu.add(exitMenuItem);


			// Edit
			var editMenu = new JMenu(_("Edit"));
			editMenu.setMnemonic(KeyEvent.VK_E)
			this._menuBar.add(editMenu)

			var cutMenuItem = new JMenuItem(_("Cut"), KeyEvent.VK_T)
			cutMenuItem.accelerator = KeyStroke.getKeyStroke(KeyEvent.VK_X, menuShortcutKeyMask)
			cutMenuItem.addActionListener(new ActionListener(){
				actionPerformed : function(e) { self.textArea.cut(); }
			});
			editMenu.add(cutMenuItem);

			var copyMenuItem = new JMenuItem(_("Copy"), KeyEvent.VK_C)
			copyMenuItem.accelerator = KeyStroke.getKeyStroke(KeyEvent.VK_C, menuShortcutKeyMask)
			copyMenuItem.addActionListener(new ActionListener(){
				actionPerformed : function(e) { self.textArea.copy(); }
			});
			editMenu.add(copyMenuItem);

			var pasteMenuItem = new JMenuItem(_("Paste"), KeyEvent.VK_P)
			pasteMenuItem.accelerator = KeyStroke.getKeyStroke(KeyEvent.VK_P, menuShortcutKeyMask)
			pasteMenuItem.addActionListener(new ActionListener(){
				actionPerformed : function(e) { self.textArea.paste(); }
			});
			editMenu.add(pasteMenuItem);

			var deleteMenuItem = new JMenuItem(_("Delete"), KeyEvent.VK_L)
			deleteMenuItem.accelerator = KeyStroke.getKeyStroke(KeyEvent.VK_DELETE, 0)
			deleteMenuItem.addActionListener(new ActionListener(){
				actionPerformed : function(e) { self.textArea.replaceSelection(""); }
			});
			editMenu.add(deleteMenuItem);

			editMenu.addSeparator()

			var selectAllMenuItem = new JMenuItem(_("SelectAll"), KeyEvent.VK_A)
			selectAllMenuItem.accelerator = KeyStroke.getKeyStroke(KeyEvent.VK_A, menuShortcutKeyMask)
			selectAllMenuItem.addActionListener(new ActionListener(){
				actionPerformed : function(e) { self.textArea.selectAll(); }
			});
			editMenu.add(selectAllMenuItem);

			var dateTimeMenuItem = new JMenuItem(_("DateAndTime"), KeyEvent.VK_D)
			dateTimeMenuItem.accelerator = KeyStroke.getKeyStroke(KeyEvent.VK_F5, 0)
			dateTimeMenuItem.addActionListener(new ActionListener(){
				actionPerformed : function(e) { self.insertDateAndTime(); }
			});
			editMenu.add(dateTimeMenuItem);

			// Format
			var formatMenu = new JMenu(_("Format"));
			formatMenu.mnemonic = KeyEvent.VK_O
			this._menuBar.add(formatMenu)

			var wrapMenuItem = new JCheckBoxMenuItem(_("LineWrap"))
			wrapMenuItem.setMnemonic(KeyEvent.VK_W)
			wrapMenuItem.addItemListener(new ItemListener(){
				itemStateChanged : function(e) {
					self.textArea.lineWrap = (e.getStateChange() == ItemEvent.SELECTED)
				}
			});
			formatMenu.add(wrapMenuItem);
		}
		return this._menuBar;
	},
	open : function()
	{
		var result = this.fileChooser.showOpenDialog(this.frame)
		if (result == JFileChooser.APPROVE_OPTION)
		{
			this.filePath = this.fileChooser.selectedFile
			this.readText();
		}
	},
	readText : function()
	{
		try
		{
			var is = new FileInputStream(this.filePath);
			var reader = new InputStreamReader(is, "UTF-8");
			var br = new BufferedReader(reader);

			var lines = new Array()
			var line;
			while ((line = br.readLine()) != null)
			{
				lines.push(line)
			}
			br.close();
			this.textArea.setText(lines.join("\n"));

		}
		catch (e)
		{
			print(e);
		}
	},
	save : function()
	{
		if (this.filePath == null)
			this.saveAs();
		else
			this.writeText();
	},
	saveAs : function()
	{
		if (this.filePath != null)
		{
			this.fileChooser.setSelectedFile(this.filePath.getAbsoluteFile());
		}

		var rc = this.fileChooser.showSaveDialog(this.frame)
		if (rc == JFileChooser.APPROVE_OPTION)
		{
			this.filePath = this.fileChooser.selectedFile
			this.writeText();
		}
	},
	writeText : function()
	{
		try
		{
			var os = new FileOutputStream(this.filePath);
			var writer = new OutputStreamWriter(os, "UTF-8");
			var bw = new BufferedWriter(writer);
			bw.write(this.textArea.text);
			bw.close();
		}
		catch (e)
		{
			print(e)
		}
	},
	insertDateAndTime : function()
	{
		var format = new SimpleDateFormat("HH:mm yyyy/MM/dd")
		var dateAndTime = format.format(new Date());
		this.textArea.replaceSelection(dateAndTime)
	},
}

// startup routine
SwingUtilities.invokeLater(new Runnable({
	run : function(){
		//UIManager.lookAndFeel = UIManager.crossPlatformLookAndFeelClassName
		UIManager.lookAndFeel = UIManager.systemLookAndFeelClassName
		app.frame.visible = true
	}
}))