//----------------------------------------------------------------------------
// COMPONENT NAME: LPEX Editor
//
// All Rights Reserved.
//
// DESCRIPTION:
// Lpex2 - sample/test class for the SWT LPEX widget: split view
//----------------------------------------------------------------------------
package com.ibm.lpex.samples;
import java.io.File;
import com.ibm.lpex.core.LpexCommand;
import com.ibm.lpex.core.LpexMessageConstants;
import com.ibm.lpex.core.LpexMultiWindow;
import com.ibm.lpex.core.LpexResources;
import com.ibm.lpex.core.LpexStringTokenizer;
import com.ibm.lpex.core.LpexView;
import com.ibm.lpex.core.LpexViewAdapter;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.MessageBox;
import org.eclipse.swt.widgets.Shell;
/**
* Sample stand-alone editor built on the LPEX edit widget.
* Displays a split view of the document.
*
* <p>Here is the Lpex2 <a href="doc-files/Lpex2.java.html">source code</a>.</p>
*
* <p>To run this sample from the command line:
* <pre>
* java [<i>options</i>] com.ibm.lpex.samples.Lpex2 [<i>filename</i>]
* [-encoding <i>encoding</i>] </pre>
* A possible Windows batch program is:
* <pre>
* @start /b java com.ibm.lpex.samples.Lpex2 %1 %2 %3 %4 %5 </pre>
* To disable the JIT compiler, run it with this option:
* <pre>
* -Djava.compiler= </pre>
* You can run Lpex in a particular locale. For example, in order to run it in
* Simplified Chinese (zh_CN), use these two options:
* <pre>
* -Duser.language=zh -Duser.region=CN </pre></p>
*
* Commands defined in here:
* <ul>
* <li><b>hor</b> command - change split orientation to horizontal
* <li><b>ver</b> command - change split orientation to vertical.
* </ul>
*
* <p>Example of running Lpex2 via a user-defined editor command:</p>
* <table bgcolor="#f0f0f0"><tr><td><pre>
* lpexView.defineCommand(<font color="#800080">"Lpex2"</font>, <font color="#0000ff"><b>new</b></font> LpexCommand() {
* <font color="#0000ff"><b>public boolean</b></font> doCommand(LpexView view, <font color="#0000ff"><b>final</b></font> String parameters)
* {
* Display display = getDisplay();
* display.asyncExec(<font color="#0000ff"><b>new</b></font> Runnable() {
* <font color="#0000ff"><b>public void</b></font> run() {
* <font color="#0000ff"><b>try</b></font>
* {
* Class cl = Class.forName(<font color="#800080">"com.ibm.lpex.samples.Lpex2"</font>);
* Method mainMethod = cl.getDeclaredMethod(<font color="#800080">"main"</font>, <font color="#0000ff"><b>new</b></font> Class[] {String[].class});
* String[] args = LpexStringTokenizer.split(parameters);
* mainMethod.invoke(<font color="#0000ff"><b>null</b></font>, <font color="#0000ff"><b>new</b></font> Object[] {args});
* }
* <font color="#0000ff"><b>catch</b></font> (Exception e) {}
* }});
* <font color="#0000ff"><b>return true</b></font>;
* }
* }); </pre></td></tr></table>
*
* @see com.ibm.lpex.samples All the samples
*/
public final class Lpex2
{
private Shell _shell;
private LpexMultiWindow _lpexMultiWindow;
/**
* Entry point.
*/
public static void main(String[] args)
{
new Lpex2(args).run().close();
}
/**
* Constructor.
* @param parms file name and parameters
*/
private Lpex2(String[] parms)
{
String filename = null;
String encoding = ""; // default to autodetect file's encoding
// extract file name and parameters
int i = 0;
if (i < parms.length && !parms[i].startsWith("-") && !parms[i].startsWith("/"))
{
filename = LpexStringTokenizer.trimQuotes(parms[i++]);
}
while (i < parms.length-1 && (parms[i].startsWith("-") || parms[i].startsWith("/")))
{
String parm = parms[i++].substring(1);
if ("encoding".equals(parm) || "enc".equals(parm))
{
encoding = parms[i++];
}
else
{
break;
}
}
// ensure canonical file name
if (filename != null)
{
if (filename.trim().length() == 0)
{
filename = null;
}
else
{
try
{
filename = (new File(filename)).getCanonicalPath();
}
catch(Exception e) {}
}
}
// create a new Shell, have the LpexMultiWindow fill it (so we don't
// have to listen to & handle shell SWT.Resize events)
_shell = new Shell();
_shell.setLayout(new FillLayout());
// listen to the closing of the Shell
_shell.addListener(SWT.Close, new Listener() {
public void handleEvent(Event event) { closeShell(event); }
});
// create LpexViews for the given file name, do explicit "updateProfile"s later
LpexView lpexView0, lpexView1 = null;
lpexView0 = new LpexView(filename, encoding, false); // new document
try
{
lpexView1 = new LpexView(lpexView0, false); // 2nd view on same document
}
catch (LpexView.ViewInstantiationException e) {}
// create & set windows for our LpexViews
_lpexMultiWindow = new LpexMultiWindow(_shell, 0);
_lpexMultiWindow.newWindow(lpexView0, SWT.BORDER);
_lpexMultiWindow.newWindow(lpexView1, SWT.BORDER);
// set Shell title
_shell.setText("Lpex2 - " + documentName());
// listen to the views
LpexViewAdapter lpexViewAdapter = new LpexViewAdapter() {
// called after an "updateProfile" command was run
public void updateProfile(LpexView lpexView)
{ Lpex2.this.updateProfile(lpexView); }
};
lpexView0.addLpexViewListener(lpexViewAdapter);
lpexView1.addLpexViewListener(lpexViewAdapter);
// run the "updateProfile" command on each view
lpexView0.doCommand("set updateProfile.palette gray"); // break symmetry
lpexView0.doCommand("updateProfile");
lpexView1.doCommand("updateProfile");
// set Shell's position & size, open it
Rectangle bounds = new Rectangle(10, 10, 1000, 711);
_shell.setBounds(bounds);
_shell.open();
}
private String documentName()
{
LpexView lpexView = _lpexMultiWindow.getFirstWindow().view();
String name = lpexView.query("name");
return (name != null)? name : LpexResources.message(LpexMessageConstants.MSG_UNTITLED_DOCUMENT,
lpexView.query("documentId"));
}
private Lpex2 run()
{
Display display = _shell.getDisplay();
while (!_shell.isDisposed())
{
if (!display.readAndDispatch())
{
display.sleep();
}
}
return this;
}
/**
* Close shop - ensure the shell is disposed.
*/
private Lpex2 close()
{
if ((_shell != null) && !_shell.isDisposed())
{
_shell.dispose();
}
_shell = null;
return this;
}
/*======================*/
/* LPEX notifications */
/*======================*/
/**
* Define editor commands, actions, and associated keys.
* Called whenever the <b>updateProfile</b> command has been processed.
*
* In this example, all the views of this same document are processed in an
* identical manner - that is, the same actions and commands are defined in
* all these views, etc.
*/
void updateProfile(LpexView lpexView)
{
// "ver" command - change split orientation to vertical
lpexView.defineCommand("ver", new LpexCommand() {
public boolean doCommand(LpexView view, String parameters)
{ return view.doCommand("set splitWindow.orientation vertical"); }
});
// "hor" command - change split orientation to horizontal
lpexView.defineCommand("hor", new LpexCommand() {
public boolean doCommand(LpexView view, String parameters)
{ return view.doCommand("set splitWindow.orientation horizontal"); }
});
}
/*=======================*/
/* Shell notifications */
/*=======================*/
// Shell close request.
private void closeShell(Event event)
{
event.doit = closeWindow();
}
// Check whether this Lpex window can be safely closed (saved / user-abandoned).
private boolean closeWindow()
{
boolean close = true;
LpexView lpexView = _lpexMultiWindow.getFirstWindow().view();
if (lpexView != null &&
(lpexView.queryInt("changes") != 0 || lpexView.queryOn("dirty")))
{
MessageBox box = new MessageBox(_shell, SWT.ICON_QUESTION | SWT.YES | SWT.NO | SWT.CANCEL);
box.setText(_shell.getText());
box.setMessage(LpexResources.message(LpexMessageConstants.MSG_FILE_SAVE_CHANGES,
documentName()));
int rc = box.open();
if (rc == SWT.YES)
{
lpexView.doCommand("save");
if (lpexView.query("status") != null) // save failed / was cancelled
{
close = false;
}
}
else if (rc == SWT.CANCEL)
{
close = false;
}
}
return close;
}
}