134dd1e25SAndrew Rist /**************************************************************
2*c3b7da30Smseidel  *
334dd1e25SAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
434dd1e25SAndrew Rist  * or more contributor license agreements.  See the NOTICE file
534dd1e25SAndrew Rist  * distributed with this work for additional information
634dd1e25SAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
734dd1e25SAndrew Rist  * to you under the Apache License, Version 2.0 (the
834dd1e25SAndrew Rist  * "License"); you may not use this file except in compliance
934dd1e25SAndrew Rist  * with the License.  You may obtain a copy of the License at
10*c3b7da30Smseidel  *
1134dd1e25SAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12*c3b7da30Smseidel  *
1334dd1e25SAndrew Rist  * Unless required by applicable law or agreed to in writing,
1434dd1e25SAndrew Rist  * software distributed under the License is distributed on an
1534dd1e25SAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
1634dd1e25SAndrew Rist  * KIND, either express or implied.  See the License for the
1734dd1e25SAndrew Rist  * specific language governing permissions and limitations
1834dd1e25SAndrew Rist  * under the License.
19*c3b7da30Smseidel  *
2034dd1e25SAndrew Rist  *************************************************************/
2134dd1e25SAndrew Rist 
2234dd1e25SAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir // __________ Imports __________
25cdf0e10cSrcweir 
26cdf0e10cSrcweir import com.sun.star.uno.UnoRuntime;
27cdf0e10cSrcweir 
28cdf0e10cSrcweir import java.awt.*;
29cdf0e10cSrcweir import java.awt.event.*;
30cdf0e10cSrcweir import java.lang.*;
31cdf0e10cSrcweir import java.net.*;
32cdf0e10cSrcweir import javax.swing.*;
33cdf0e10cSrcweir import javax.swing.border.*;
34cdf0e10cSrcweir import java.awt.AWTEvent;
35cdf0e10cSrcweir import java.awt.event.WindowEvent;
36cdf0e10cSrcweir 
37cdf0e10cSrcweir // __________ Implementation __________
38cdf0e10cSrcweir 
39cdf0e10cSrcweir /**
40a893be29SPedro Giffuni  * This implement a java frame which contains
41cdf0e10cSrcweir  * an office document, shows some status informations
42cdf0e10cSrcweir  * about that, provides simple functionality on it
43cdf0e10cSrcweir  * (e.g. toggle menubar, save document) and
44cdf0e10cSrcweir  * react for different situations independent
45cdf0e10cSrcweir  * (e.g. closing the document from outside).
46cdf0e10cSrcweir  * Every instance of this class will be a member
47cdf0e10cSrcweir  * inside the global "ViewContainer" of this java
48cdf0e10cSrcweir  * demo application which holds all opened views alive.
49cdf0e10cSrcweir  *
50cdf0e10cSrcweir  * @author     Andreas Schlüns
51cdf0e10cSrcweir  * @created    06.03.2002 09:38
52cdf0e10cSrcweir  */
53cdf0e10cSrcweir public class DocumentView extends    JFrame
54cdf0e10cSrcweir                           implements com.sun.star.lang.XEventListener, // react for Frame::disposing()
55cdf0e10cSrcweir                                      IShutdownListener                 // react for System.exit()
56cdf0e10cSrcweir {
57cdf0e10cSrcweir     // ____________________
58cdf0e10cSrcweir 
59cdf0e10cSrcweir     /**
60cdf0e10cSrcweir      * const
61cdf0e10cSrcweir      * These command strings are used to identify a received action
62cdf0e10cSrcweir      * of buttons on which we listen for action events.
63cdf0e10cSrcweir      */
64cdf0e10cSrcweir     public static final String COMMAND_OPEN   = "open"   ;
65cdf0e10cSrcweir     public static final String COMMAND_SAVE   = "save"   ;
66cdf0e10cSrcweir     public static final String COMMAND_EXPORT = "export" ;
67cdf0e10cSrcweir     public static final String COMMAND_EXIT   = "exit"   ;
68cdf0e10cSrcweir 
69cdf0e10cSrcweir     // ____________________
70cdf0e10cSrcweir 
71cdf0e10cSrcweir     /**
72cdf0e10cSrcweir      * @member  mxFrame             office frame which contains the document of this view
73cdf0e10cSrcweir      *
74a893be29SPedro Giffuni      * @member  maStatusView        special panel which show available status informations of currently loaded document
75cdf0e10cSrcweir      * @member  maDocumentView      use JNI mechanism to plug an office window into our own java UI container (used for inplace mode only!)
76cdf0e10cSrcweir      * @member  maCustomizeView     special panel makes it possible to toggle menubar/toolbar or objectbar of loaded document
77cdf0e10cSrcweir      * @member  maInterceptor       interceptor thread which intercept "new" menu of office frame to open new frames inside this java application
78cdf0e10cSrcweir      *
79cdf0e10cSrcweir      * @member  msName              unique name of this view (returned by the global ViewContainer during registration)
80cdf0e10cSrcweir      *
81cdf0e10cSrcweir      * @member  mbOpen              button to open documents
82cdf0e10cSrcweir      * @member  mbSave              button to save currently loaded document
83cdf0e10cSrcweir      * @member  mbExport            button to save currently loaded document in HTML format (if it is possible!)
84cdf0e10cSrcweir      * @member  mbExit              button to exit this demo
85cdf0e10cSrcweir      *
86cdf0e10cSrcweir      * @member  maInterception      we try to intercept the file->new menu to open new document inside this java application
87cdf0e10cSrcweir      */
88cdf0e10cSrcweir     private com.sun.star.frame.XFrame       mxFrame             ;
89cdf0e10cSrcweir 
90cdf0e10cSrcweir     private StatusView                      maStatusView        ;
91cdf0e10cSrcweir     private NativeView                      maDocumentView      ;
92cdf0e10cSrcweir     private CustomizeView                   maCustomizeView     ;
93cdf0e10cSrcweir     private Interceptor                     maInterceptor       ;
94cdf0e10cSrcweir 
95cdf0e10cSrcweir     private String                          msName              ;
96cdf0e10cSrcweir 
97cdf0e10cSrcweir     private JButton                         mbtOpen             ;
98cdf0e10cSrcweir     private JButton                         mbtSave             ;
99cdf0e10cSrcweir     private JButton                         mbtExport           ;
100cdf0e10cSrcweir     private JButton                         mbtExit             ;
101cdf0e10cSrcweir 
102cdf0e10cSrcweir     private boolean                         mbDead              ;
103cdf0e10cSrcweir 
104cdf0e10cSrcweir     // ____________________
105cdf0e10cSrcweir 
106cdf0e10cSrcweir     /**
107cdf0e10cSrcweir      * ctor
108cdf0e10cSrcweir      * Create view controls on startup and initialize it with default values.
109cdf0e10cSrcweir      */
DocumentView()110cdf0e10cSrcweir     DocumentView()
111cdf0e10cSrcweir     {
112cdf0e10cSrcweir         this.setSize( new Dimension(800,600) );
113cdf0e10cSrcweir 
114cdf0e10cSrcweir         JPanel paMainPanel = (JPanel)this.getContentPane();
115cdf0e10cSrcweir 
116cdf0e10cSrcweir         // create and add command buttons to a panel
117cdf0e10cSrcweir         // it will be a sub panel of later layouted UI
118cdf0e10cSrcweir         mbtOpen   = new JButton("Open ..."        );
119cdf0e10cSrcweir         mbtSave   = new JButton("Save"            );
120cdf0e10cSrcweir         mbtExport = new JButton("Save as HTML ...");
121cdf0e10cSrcweir         mbtExit   = new JButton("Exit"            );
122cdf0e10cSrcweir 
123cdf0e10cSrcweir         mbtOpen.setEnabled  (true );
124cdf0e10cSrcweir         mbtSave.setEnabled  (false);
125cdf0e10cSrcweir         mbtExport.setEnabled(false);
126cdf0e10cSrcweir         mbtExit.setEnabled  (true );
127cdf0e10cSrcweir 
128cdf0e10cSrcweir         mbtOpen.setActionCommand  (COMMAND_OPEN  );
129cdf0e10cSrcweir         mbtSave.setActionCommand  (COMMAND_SAVE  );
130cdf0e10cSrcweir         mbtExport.setActionCommand(COMMAND_EXPORT);
131cdf0e10cSrcweir         mbtExit.setActionCommand  (COMMAND_EXIT  );
132cdf0e10cSrcweir 
133cdf0e10cSrcweir         Reactor aListener = new Reactor();
134cdf0e10cSrcweir         mbtOpen.addActionListener  (aListener);
135cdf0e10cSrcweir         mbtSave.addActionListener  (aListener);
136cdf0e10cSrcweir         mbtExport.addActionListener(aListener);
137cdf0e10cSrcweir         mbtExit.addActionListener  (aListener);
138cdf0e10cSrcweir 
139cdf0e10cSrcweir         JPanel paCommands = new JPanel( new GridLayout(4,0) );
140cdf0e10cSrcweir         paCommands.add(mbtOpen);
141cdf0e10cSrcweir         paCommands.add(mbtSave);
142cdf0e10cSrcweir         paCommands.add(mbtExport);
143cdf0e10cSrcweir         paCommands.add(mbtExit);
144cdf0e10cSrcweir 
145cdf0e10cSrcweir         // create view to show status informations of opened file
146cdf0e10cSrcweir         maStatusView = new StatusView();
147cdf0e10cSrcweir 
148cdf0e10cSrcweir         // create view for toggle different bar's of document
149cdf0e10cSrcweir         maCustomizeView = new CustomizeView();
150cdf0e10cSrcweir 
151cdf0e10cSrcweir         paCommands.setBorder     ( new TitledBorder(BorderFactory.createEtchedBorder(),"Commands")                );
152cdf0e10cSrcweir         maStatusView.setBorder   ( new TitledBorder(BorderFactory.createEtchedBorder(),"Status Informations")     );
153cdf0e10cSrcweir         maCustomizeView.setBorder( new TitledBorder(BorderFactory.createEtchedBorder(),"Customize Document View") );
154cdf0e10cSrcweir 
155cdf0e10cSrcweir         // layout the whole UI
156cdf0e10cSrcweir         JPanel paTest = new JPanel(new GridLayout(3,0));
157cdf0e10cSrcweir         paTest.add(paCommands     );
158cdf0e10cSrcweir         paTest.add(maStatusView   );
159cdf0e10cSrcweir         paTest.add(maCustomizeView);
160cdf0e10cSrcweir         JScrollPane paScroll = new JScrollPane();
161cdf0e10cSrcweir         paScroll.getViewport().add(paTest,null);
162cdf0e10cSrcweir 
163cdf0e10cSrcweir         if(ViewContainer.mbInplace==true)
164cdf0e10cSrcweir         {
165cdf0e10cSrcweir             // create view to show opened documents
166a893be29SPedro Giffuni             // This special view is necessary for inplace mode only!
167cdf0e10cSrcweir             maDocumentView = new NativeView();
168cdf0e10cSrcweir 
169cdf0e10cSrcweir             JSplitPane paSplit = new JSplitPane();
170cdf0e10cSrcweir             paSplit.setOneTouchExpandable( true );
171cdf0e10cSrcweir 
172cdf0e10cSrcweir             paSplit.setLeftComponent (maDocumentView);
173cdf0e10cSrcweir             paSplit.setRightComponent(paScroll      );
174cdf0e10cSrcweir 
175cdf0e10cSrcweir             paMainPanel.add(paSplit);
176cdf0e10cSrcweir         }
177cdf0e10cSrcweir         else
178cdf0e10cSrcweir         {
179cdf0e10cSrcweir             paMainPanel.add(paScroll);
180cdf0e10cSrcweir         }
181cdf0e10cSrcweir 
182cdf0e10cSrcweir         // Register this new view on our global view container.
183cdf0e10cSrcweir         msName = FunctionHelper.getUniqueFrameName();
184cdf0e10cSrcweir         this.setTitle(msName);
185cdf0e10cSrcweir         ViewContainer.getGlobalContainer().addView(this);
186cdf0e10cSrcweir         ViewContainer.getGlobalContainer().addListener(this);
187cdf0e10cSrcweir         // be listener for closing the application
188cdf0e10cSrcweir         this.enableEvents(AWTEvent.WINDOW_EVENT_MASK);
189cdf0e10cSrcweir     }
190cdf0e10cSrcweir 
191cdf0e10cSrcweir     // ____________________
192cdf0e10cSrcweir 
193cdf0e10cSrcweir     /**
194cdf0e10cSrcweir      * Create the view frame for showing the office documents on demand.
195*c3b7da30Smseidel      * Dependent from given command line parameter we create
196cdf0e10cSrcweir      * an office XFrame and initialize it with a window. This
197cdf0e10cSrcweir      * window can be a pure toolkit window (means toolkit of office!)
198cdf0e10cSrcweir      * or a plugged java canvas - office window combination.
199cdf0e10cSrcweir      */
createFrame()200cdf0e10cSrcweir     public void createFrame()
201cdf0e10cSrcweir     {
202cdf0e10cSrcweir         // create view frame (as a XFrame!) here
203*c3b7da30Smseidel         // Look for right view mode set by user command line parameter.
204*c3b7da30Smseidel         // First try to get a new unambiguous frame name from our global ViewContainer.
205cdf0e10cSrcweir         if(ViewContainer.mbInplace==true)
206cdf0e10cSrcweir         {
207cdf0e10cSrcweir             // inplace document view can't be initialized without a visible parent window hierarchy!
20801ad09a0Smseidel             // So make sure that we are visible in every case!
209cdf0e10cSrcweir             this.setVisible(true);
210cdf0e10cSrcweir             mxFrame = FunctionHelper.createViewFrame(msName,maDocumentView);
211cdf0e10cSrcweir         }
212cdf0e10cSrcweir         else
213cdf0e10cSrcweir             mxFrame = FunctionHelper.createViewFrame(msName,null);
214cdf0e10cSrcweir 
215cdf0e10cSrcweir         if(mxFrame!=null)
216cdf0e10cSrcweir         {
217cdf0e10cSrcweir             // start interception
218cdf0e10cSrcweir             maInterceptor = new Interceptor(mxFrame);
219cdf0e10cSrcweir             maInterceptor.startListening();
220cdf0e10cSrcweir 
221cdf0e10cSrcweir             // start listening for status events and actualization
222cdf0e10cSrcweir             // of our status view
223cdf0e10cSrcweir             // (of course for our CustomizeView too)
224cdf0e10cSrcweir             maStatusView.setFrame   (mxFrame);
225cdf0e10cSrcweir             maCustomizeView.setFrame(mxFrame);
226cdf0e10cSrcweir 
227cdf0e10cSrcweir             // be listener for closing the remote target view frame
228cdf0e10cSrcweir             com.sun.star.lang.XComponent xBroadcaster = (com.sun.star.lang.XComponent)UnoRuntime.queryInterface(
229cdf0e10cSrcweir                 com.sun.star.lang.XComponent.class,
230cdf0e10cSrcweir                 mxFrame);
231cdf0e10cSrcweir 
232cdf0e10cSrcweir             if(xBroadcaster!=null)
233cdf0e10cSrcweir                 xBroadcaster.addEventListener(this);
234cdf0e10cSrcweir         }
235cdf0e10cSrcweir     }
236cdf0e10cSrcweir 
237cdf0e10cSrcweir     // ____________________
238cdf0e10cSrcweir 
239cdf0e10cSrcweir     /**
240cdf0e10cSrcweir      * Different ways to load any URL from outside (may be by the command line)
241cdf0e10cSrcweir      * into this document view or to save it.
242cdf0e10cSrcweir      */
load(String sURL)243cdf0e10cSrcweir     public void load(String sURL)
244cdf0e10cSrcweir     {
245cdf0e10cSrcweir         load(sURL,new com.sun.star.beans.PropertyValue[0]);
246cdf0e10cSrcweir     }
247cdf0e10cSrcweir 
248cdf0e10cSrcweir     // ____________________
249cdf0e10cSrcweir 
load(String sURL, com.sun.star.beans.PropertyValue[] lArguments)250cdf0e10cSrcweir     public void load(String sURL, com.sun.star.beans.PropertyValue[] lArguments)
251cdf0e10cSrcweir     {
252cdf0e10cSrcweir         com.sun.star.lang.XComponent xDocument = FunctionHelper.loadDocument(mxFrame,sURL,lArguments);
253cdf0e10cSrcweir         if(xDocument!=null)
254cdf0e10cSrcweir         {
255cdf0e10cSrcweir             mbtSave.setEnabled  (true);
256cdf0e10cSrcweir             mbtExport.setEnabled(true);
257cdf0e10cSrcweir         }
258cdf0e10cSrcweir         else
259cdf0e10cSrcweir         {
260cdf0e10cSrcweir             mbtSave.setEnabled  (false);
261cdf0e10cSrcweir             mbtExport.setEnabled(false);
262cdf0e10cSrcweir         }
263cdf0e10cSrcweir     }
264cdf0e10cSrcweir 
265cdf0e10cSrcweir     // ____________________
266cdf0e10cSrcweir 
save()267cdf0e10cSrcweir     public void save()
268cdf0e10cSrcweir     {
269cdf0e10cSrcweir         com.sun.star.frame.XController xController = mxFrame.getController();
270cdf0e10cSrcweir         if (xController==null)
271cdf0e10cSrcweir             return;
272cdf0e10cSrcweir         com.sun.star.frame.XModel xDocument = xController.getModel();
273cdf0e10cSrcweir         if (xDocument==null)
274cdf0e10cSrcweir             return;
275cdf0e10cSrcweir         FunctionHelper.saveDocument(xDocument);
276cdf0e10cSrcweir     }
277cdf0e10cSrcweir 
278cdf0e10cSrcweir     // ____________________
279cdf0e10cSrcweir 
exportHTML(String sURL)280cdf0e10cSrcweir     public void exportHTML(String sURL)
281cdf0e10cSrcweir     {
282cdf0e10cSrcweir         com.sun.star.frame.XController xController = mxFrame.getController();
283cdf0e10cSrcweir         if (xController==null)
284cdf0e10cSrcweir             return;
285cdf0e10cSrcweir         com.sun.star.frame.XModel xDocument = xController.getModel();
286cdf0e10cSrcweir         if (xDocument==null)
287cdf0e10cSrcweir             return;
288cdf0e10cSrcweir         FunctionHelper.saveAsHTML(xDocument,sURL);
289cdf0e10cSrcweir     }
290cdf0e10cSrcweir 
291cdf0e10cSrcweir     // ____________________
292cdf0e10cSrcweir 
293cdf0e10cSrcweir     /**
294cdf0e10cSrcweir      * Overridden so we can react for window closing of this view.
295cdf0e10cSrcweir      */
processWindowEvent(WindowEvent aEvent)296cdf0e10cSrcweir     protected void processWindowEvent(WindowEvent aEvent)
297cdf0e10cSrcweir     {
298cdf0e10cSrcweir         if (aEvent.getID()!=WindowEvent.WINDOW_CLOSING)
299cdf0e10cSrcweir         {
300cdf0e10cSrcweir             super.processWindowEvent(aEvent);
301cdf0e10cSrcweir         }
302cdf0e10cSrcweir         else
303cdf0e10cSrcweir         if (FunctionHelper.closeFrame(mxFrame))
304cdf0e10cSrcweir         {
305cdf0e10cSrcweir             mxFrame = null;
306cdf0e10cSrcweir             shutdown();
307cdf0e10cSrcweir             super.processWindowEvent(aEvent);
308cdf0e10cSrcweir         }
309cdf0e10cSrcweir     }
310cdf0e10cSrcweir 
311cdf0e10cSrcweir     // ____________________
312cdf0e10cSrcweir 
313cdf0e10cSrcweir     /**
3142e3a1b6eSmseidel      * Here we can react for System.exit() normally.
315cdf0e10cSrcweir      * But we use it for disposing() or windowClosing() too.
316cdf0e10cSrcweir      */
shutdown()317cdf0e10cSrcweir     public void shutdown()
318cdf0e10cSrcweir     {
319cdf0e10cSrcweir         if (mbDead)
320cdf0e10cSrcweir             return;
321cdf0e10cSrcweir         mbDead=true;
322cdf0e10cSrcweir 
323cdf0e10cSrcweir         // force these sub view to release her remote
324a893be29SPedro Giffuni         // references too!
325cdf0e10cSrcweir         maStatusView.shutdown();
326cdf0e10cSrcweir         maCustomizeView.shutdown();
327cdf0e10cSrcweir 
328cdf0e10cSrcweir         maStatusView    = null;
329cdf0e10cSrcweir         maCustomizeView = null;
330cdf0e10cSrcweir 
331cdf0e10cSrcweir         // disable all interceptions
332cdf0e10cSrcweir         maInterceptor.shutdown();
333cdf0e10cSrcweir         maInterceptor = null;
334cdf0e10cSrcweir 
335cdf0e10cSrcweir         // close the frame and his document
336*c3b7da30Smseidel         // Releasing of our listener connections for disposing()
337a893be29SPedro Giffuni         // will be forced automatically then. Because the frame
338cdf0e10cSrcweir         // will call us back ...
339cdf0e10cSrcweir         if (mxFrame!=null)
340cdf0e10cSrcweir             FunctionHelper.closeFrame(mxFrame);
341cdf0e10cSrcweir 
342cdf0e10cSrcweir         // deregister this view in the global container
3432e3a1b6eSmseidel         // Normally we should die afterwards by garbage collection ...
3442e3a1b6eSmseidel         // In case this was the last view - it forces a system.exit().
345cdf0e10cSrcweir         // But then we are no longer a member of the global container
346cdf0e10cSrcweir         // of possible shutdown listener ... and this method should be
347cdf0e10cSrcweir         // called again.
348cdf0e10cSrcweir         ViewContainer.getGlobalContainer().removeView(this);
349cdf0e10cSrcweir     }
350cdf0e10cSrcweir 
351cdf0e10cSrcweir     // ____________________
352cdf0e10cSrcweir 
353cdf0e10cSrcweir     /**
354cdf0e10cSrcweir      * callback from our internal saved frame
355a893be29SPedro Giffuni      * which wish to die. Its not necessary to remove listener connections
356a893be29SPedro Giffuni      * here. Because the broadcaster do it automatically.
357cdf0e10cSrcweir      * We have to release all references to him only.
358cdf0e10cSrcweir      *
359cdf0e10cSrcweir      * @param aSource
360cdf0e10cSrcweir      *          describe the broadcaster of this event
361cdf0e10cSrcweir      *          Must be our internal saved frame.
362cdf0e10cSrcweir      */
disposing(com.sun.star.lang.EventObject aSource)363cdf0e10cSrcweir     public void disposing(com.sun.star.lang.EventObject aSource)
364cdf0e10cSrcweir     {
365cdf0e10cSrcweir         mxFrame = null;
366cdf0e10cSrcweir     }
367cdf0e10cSrcweir 
368cdf0e10cSrcweir     // ____________________
369cdf0e10cSrcweir 
370cdf0e10cSrcweir     /**
371cdf0e10cSrcweir      * This inner class is used to react for events of our own UI controls.
372cdf0e10cSrcweir      * So we can start different actions then.
373cdf0e10cSrcweir      */
374cdf0e10cSrcweir     private class Reactor implements ActionListener
375cdf0e10cSrcweir     {
376cdf0e10cSrcweir         // ____________________
377cdf0e10cSrcweir 
378cdf0e10cSrcweir         /**
379cdf0e10cSrcweir         * This method react for pressed buttons or selected check boxes.
380cdf0e10cSrcweir         */
actionPerformed(ActionEvent aEvent)381cdf0e10cSrcweir         public void actionPerformed(ActionEvent aEvent)
382cdf0e10cSrcweir         {
383cdf0e10cSrcweir             String sCommand = aEvent.getActionCommand();
384cdf0e10cSrcweir             //-----------------------------
385cdf0e10cSrcweir             // open any file from disk
386cdf0e10cSrcweir             if( sCommand.compareTo(COMMAND_OPEN) == 0 )
387cdf0e10cSrcweir             {
388cdf0e10cSrcweir                 String sURL = FunctionHelper.askUserForFileURL(DocumentView.this,true);
389cdf0e10cSrcweir                 if(sURL!=null)
390cdf0e10cSrcweir                     DocumentView.this.load(sURL);
391cdf0e10cSrcweir             }
392cdf0e10cSrcweir             else
393cdf0e10cSrcweir             //-----------------------------
394cdf0e10cSrcweir             // save current document
395cdf0e10cSrcweir             if( sCommand.compareTo(COMMAND_SAVE) == 0 )
396cdf0e10cSrcweir             {
397cdf0e10cSrcweir                 DocumentView.this.save();
398cdf0e10cSrcweir             }
399cdf0e10cSrcweir             else
400cdf0e10cSrcweir             //-----------------------------
401cdf0e10cSrcweir             // export current document to html
402cdf0e10cSrcweir             if( sCommand.compareTo(COMMAND_EXPORT) == 0 )
403cdf0e10cSrcweir             {
404cdf0e10cSrcweir                 String sURL = FunctionHelper.askUserForFileURL(DocumentView.this,false);
405cdf0e10cSrcweir                 if(sURL!=null)
406cdf0e10cSrcweir                     DocumentView.this.exportHTML(sURL);
407cdf0e10cSrcweir             }
408cdf0e10cSrcweir             else
409cdf0e10cSrcweir             //-----------------------------
410cdf0e10cSrcweir             // exit application
411cdf0e10cSrcweir             if( sCommand.compareTo(COMMAND_EXIT) == 0 )
412cdf0e10cSrcweir             {
413cdf0e10cSrcweir                 // This will force deleting of this and
414a893be29SPedro Giffuni                 // all other currently opened views automatically!
415cdf0e10cSrcweir                 System.exit(0);
416cdf0e10cSrcweir             }
417cdf0e10cSrcweir         }
418cdf0e10cSrcweir     }
419cdf0e10cSrcweir }
420