1 /***
2 * Redistribution and use in source and binary forms, with or without
3 * modification, are permitted provided that the following conditions are
4 * met :
5 *
6 * . Redistributions of source code must retain the above copyright
7 * notice, this list of conditions and the following disclaimer.
8 *
9 * . Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 *
13 * . The name of the author may not be used to endorse or promote products
14 * derived from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
17 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19 * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
20 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
22 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
24 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
25 * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
26 * POSSIBILITY OF SUCH DAMAGE.
27 *
28 * $Id: PalmEd.java 406 2006-01-02 07:37:11Z mat007 $
29 */
30
31 package palmed;
32
33 import javax.microedition.lcdui.Alert;
34 import javax.microedition.lcdui.AlertType;
35 import javax.microedition.lcdui.Display;
36 import javax.microedition.midlet.MIDlet;
37 import palmed.buffer.BufferFactory;
38 import palmed.buffer.IBufferFactory;
39 import palmed.buffer.IBufferManager;
40 import palmed.buffer.RecordBufferManager;
41 import palmed.command.AboutCommand;
42 import palmed.command.CloseCommand;
43 import palmed.command.CopyCommand;
44 import palmed.command.CopyPasteManager;
45 import palmed.command.CutCommand;
46 import palmed.command.ExitCommand;
47 import palmed.command.NewCommand;
48 import palmed.command.NextCommand;
49 import palmed.command.OpenCommand;
50 import palmed.command.PasteCommand;
51 import palmed.command.PreferencesCommand;
52 import palmed.command.PreviousCommand;
53 import palmed.command.RedoCommand;
54 import palmed.command.SaveAsCommand;
55 import palmed.command.SaveCommand;
56 import palmed.command.UndoCommand;
57 import palmed.edit.TextBox;
58 import palmed.file.FileBrowser;
59 import palmed.io.RecordException;
60 import palmed.io.RecordFactory;
61 import palmed.ui.ICommand;
62 import palmed.ui.ICommandListener;
63 import palmed.ui.Toolbar;
64
65 /***
66 * This class implements the application bootstrap.
67 *
68 * @author Mathieu Champlon
69 * @version $Revision: 406 $ $Date: 2006-01-02 16:37:11 +0900 (lun., 02 janv. 2006) $
70 */
71 public final class PalmEd extends MIDlet implements ICommandListener
72 {
73 /***
74 * The display.
75 */
76 private final Display display_;
77 /***
78 * The text box.
79 */
80 private final TextBox textBox_;
81 /***
82 * The command to execute upon exit.
83 */
84 private final ICommand exit_;
85
86 /***
87 * Create the application.
88 */
89 public PalmEd()
90 {
91 display_ = Display.getDisplay( this );
92 textBox_ = new TextBox();
93 final RecordFactory mainFactory = new RecordFactory( "palmed" );
94 final RecordFactory buffersFactory = new RecordFactory( "palmed.buffers" );
95 final IBufferFactory factory = new BufferFactory( buffersFactory, textBox_ );
96 final IBufferManager manager = new RecordBufferManager( factory );
97 try
98 {
99 exit_ = new ExitCommand( this, manager, mainFactory );
100 }
101 catch( RecordException e )
102 {
103 mainFactory.purge();
104 buffersFactory.purge();
105 throw new RecordException( "Incompatible buffer format detected : quit and restart", e );
106 }
107 textBox_.add( createToolbar( manager ) );
108 }
109
110 private Toolbar createToolbar( final IBufferManager manager )
111 {
112 final Result result = new Result( display_, textBox_ );
113 final FileOpenListener openListener = new FileOpenListener( manager, result );
114 final FileSaveListener saveListener = new FileSaveListener( manager, result );
115 final FileOverwriteListener overwriteListener = new FileOverwriteListener( display_, textBox_, saveListener );
116 final FileBrowser fileBrowser = new FileBrowser( display_, textBox_ );
117 final CopyPasteManager copyPaste = new CopyPasteManager( textBox_ );
118 final Toolbar toolbar = new Toolbar( this, textBox_ );
119 toolbar.add( exit_, "/icons/system-log-out.png" );
120 toolbar.add( new NewCommand( manager ), "/icons/document-new.png" );
121 toolbar.add( new OpenCommand( display_, fileBrowser, openListener ), "/icons/document-open.png" );
122 final ICommand saveAsCommand = new SaveAsCommand( display_, fileBrowser, overwriteListener );
123 toolbar.add( new SaveCommand( manager, saveAsCommand ), "/icons/document-save-as.png" );
124 toolbar.add( saveAsCommand, "/icons/document-save.png" );
125 toolbar.add( new CloseCommand( display_, manager, result ), "/icons/process-stop.png" );
126 toolbar.add( new PreviousCommand( manager ), "/icons/go-previous.png" );
127 toolbar.add( new NextCommand( manager ), "/icons/go-next.png" );
128 toolbar.add( new CutCommand( copyPaste ), "/icons/edit-cut.png" );
129 toolbar.add( new CopyCommand( copyPaste ), "/icons/edit-copy.png" );
130 toolbar.add( new PasteCommand( copyPaste ), "/icons/edit-paste.png" );
131 toolbar.add( new UndoCommand( textBox_ ), "icons/edit-undo.png" );
132 toolbar.add( new RedoCommand( textBox_ ), "icons/edit-redo.png" );
133 final RecordFactory preferencesFactory = new RecordFactory( "palmed.preferences" );
134 toolbar.add( new PreferencesCommand( display_, textBox_, preferencesFactory, textBox_ ),
135 "icons/preferences-desktop.png" );
136 toolbar.add( new AboutCommand( this, display_, textBox_ ), "/icons/help-browser.png" );
137 return toolbar;
138 }
139
140 /***
141 * {@inheritDoc}
142 */
143 public void startApp()
144 {
145 display_.setCurrent( textBox_ );
146 }
147
148 /***
149 * {@inheritDoc}
150 */
151 public void pauseApp()
152 {
153 }
154
155 /***
156 * {@inheritDoc}
157 */
158 public void destroyApp( final boolean unconditional )
159 {
160 triggered( exit_ );
161 }
162
163 /***
164 * {@inheritDoc}
165 */
166 public void triggered( final ICommand command )
167 {
168 try
169 {
170 command.execute();
171 }
172 catch( OutOfMemoryError e )
173 {
174 e.printStackTrace();
175 error( "Out of memory", e.getMessage() );
176 }
177 catch( Throwable e )
178 {
179 e.printStackTrace();
180 error( "Error", e.getMessage() );
181 }
182 }
183
184 private void error( final String title, final String message )
185 {
186 display_.setCurrent( new Alert( title, message, null, AlertType.ERROR ) );
187 }
188 }