1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski  *
3*b1cdbd2cSJim Jagielski  * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski  * or more contributor license agreements.  See the NOTICE file
5*b1cdbd2cSJim Jagielski  * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski  * regarding copyright ownership.  The ASF licenses this file
7*b1cdbd2cSJim Jagielski  * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski  * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski  * with the License.  You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski  *
11*b1cdbd2cSJim Jagielski  *   http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski  *
13*b1cdbd2cSJim Jagielski  * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski  * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski  * KIND, either express or implied.  See the License for the
17*b1cdbd2cSJim Jagielski  * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski  * under the License.
19*b1cdbd2cSJim Jagielski  *
20*b1cdbd2cSJim Jagielski  *************************************************************/
21*b1cdbd2cSJim Jagielski 
22*b1cdbd2cSJim Jagielski 
23*b1cdbd2cSJim Jagielski 
24*b1cdbd2cSJim Jagielski package com.sun.star.wiki;
25*b1cdbd2cSJim Jagielski 
26*b1cdbd2cSJim Jagielski import com.sun.star.uno.Any;
27*b1cdbd2cSJim Jagielski import com.sun.star.awt.XDialog;
28*b1cdbd2cSJim Jagielski import com.sun.star.awt.XCallback;
29*b1cdbd2cSJim Jagielski import com.sun.star.awt.XMessageBox;
30*b1cdbd2cSJim Jagielski import com.sun.star.awt.XRequestCallback;
31*b1cdbd2cSJim Jagielski import com.sun.star.lang.XMultiComponentFactory;
32*b1cdbd2cSJim Jagielski import com.sun.star.uno.UnoRuntime;
33*b1cdbd2cSJim Jagielski import com.sun.star.uno.XComponentContext;
34*b1cdbd2cSJim Jagielski 
35*b1cdbd2cSJim Jagielski public class MainThreadDialogExecutor implements XCallback
36*b1cdbd2cSJim Jagielski {
37*b1cdbd2cSJim Jagielski     private WikiDialog m_aWikiDialog;
38*b1cdbd2cSJim Jagielski     private XDialog    m_xDialog;
39*b1cdbd2cSJim Jagielski     private XMessageBox m_xMessageBox;
40*b1cdbd2cSJim Jagielski     private boolean    m_bResult = false;
41*b1cdbd2cSJim Jagielski     private boolean    m_bCalled = false;
42*b1cdbd2cSJim Jagielski     private boolean    m_bClose = false;
43*b1cdbd2cSJim Jagielski 
Show( XComponentContext xContext, WikiDialog aWikiDialog )44*b1cdbd2cSJim Jagielski     static public boolean Show( XComponentContext xContext, WikiDialog aWikiDialog )
45*b1cdbd2cSJim Jagielski     {
46*b1cdbd2cSJim Jagielski         MainThreadDialogExecutor aExecutor = new MainThreadDialogExecutor( aWikiDialog );
47*b1cdbd2cSJim Jagielski         return GetCallback( xContext, aExecutor );
48*b1cdbd2cSJim Jagielski     }
49*b1cdbd2cSJim Jagielski 
Execute( XComponentContext xContext, XDialog xDialog )50*b1cdbd2cSJim Jagielski     static public boolean Execute( XComponentContext xContext, XDialog xDialog )
51*b1cdbd2cSJim Jagielski     {
52*b1cdbd2cSJim Jagielski         MainThreadDialogExecutor aExecutor = new MainThreadDialogExecutor( xDialog );
53*b1cdbd2cSJim Jagielski         return GetCallback( xContext, aExecutor );
54*b1cdbd2cSJim Jagielski     }
55*b1cdbd2cSJim Jagielski 
Execute( XComponentContext xContext, XMessageBox xMessageBox )56*b1cdbd2cSJim Jagielski     static public boolean Execute( XComponentContext xContext, XMessageBox xMessageBox )
57*b1cdbd2cSJim Jagielski     {
58*b1cdbd2cSJim Jagielski         MainThreadDialogExecutor aExecutor = new MainThreadDialogExecutor( xMessageBox );
59*b1cdbd2cSJim Jagielski         return GetCallback( xContext, aExecutor );
60*b1cdbd2cSJim Jagielski     }
61*b1cdbd2cSJim Jagielski 
Close( XComponentContext xContext, XDialog xDialog )62*b1cdbd2cSJim Jagielski     static public boolean Close( XComponentContext xContext, XDialog xDialog )
63*b1cdbd2cSJim Jagielski     {
64*b1cdbd2cSJim Jagielski         MainThreadDialogExecutor aExecutor = new MainThreadDialogExecutor( xDialog, true );
65*b1cdbd2cSJim Jagielski         return GetCallback( xContext, aExecutor );
66*b1cdbd2cSJim Jagielski     }
67*b1cdbd2cSJim Jagielski 
GetCallback( XComponentContext xContext, MainThreadDialogExecutor aExecutor )68*b1cdbd2cSJim Jagielski     static private boolean GetCallback( XComponentContext xContext, MainThreadDialogExecutor aExecutor )
69*b1cdbd2cSJim Jagielski     {
70*b1cdbd2cSJim Jagielski         try
71*b1cdbd2cSJim Jagielski         {
72*b1cdbd2cSJim Jagielski             if ( aExecutor != null )
73*b1cdbd2cSJim Jagielski             {
74*b1cdbd2cSJim Jagielski                 String aThreadName = null;
75*b1cdbd2cSJim Jagielski                 Thread aCurThread = Thread.currentThread();
76*b1cdbd2cSJim Jagielski                 if ( aCurThread != null )
77*b1cdbd2cSJim Jagielski                     aThreadName = aCurThread.getName();
78*b1cdbd2cSJim Jagielski 
79*b1cdbd2cSJim Jagielski                 if ( aThreadName != null && aThreadName.equals( "com.sun.star.thread.WikiEditorSendingThread" ) )
80*b1cdbd2cSJim Jagielski                 {
81*b1cdbd2cSJim Jagielski                     // the main thread should be accessed asynchronously
82*b1cdbd2cSJim Jagielski                     XMultiComponentFactory xFactory = xContext.getServiceManager();
83*b1cdbd2cSJim Jagielski                     if ( xFactory == null )
84*b1cdbd2cSJim Jagielski                         throw new com.sun.star.uno.RuntimeException();
85*b1cdbd2cSJim Jagielski 
86*b1cdbd2cSJim Jagielski                     XRequestCallback xRequest = (XRequestCallback)UnoRuntime.queryInterface(
87*b1cdbd2cSJim Jagielski                         XRequestCallback.class,
88*b1cdbd2cSJim Jagielski                         xFactory.createInstanceWithContext( "com.sun.star.awt.AsyncCallback", xContext ) );
89*b1cdbd2cSJim Jagielski                     if ( xRequest != null )
90*b1cdbd2cSJim Jagielski                     {
91*b1cdbd2cSJim Jagielski                         xRequest.addCallback( aExecutor, Any.VOID );
92*b1cdbd2cSJim Jagielski                         do
93*b1cdbd2cSJim Jagielski                         {
94*b1cdbd2cSJim Jagielski                             Thread.yield();
95*b1cdbd2cSJim Jagielski                         }
96*b1cdbd2cSJim Jagielski                         while( !aExecutor.m_bCalled );
97*b1cdbd2cSJim Jagielski                     }
98*b1cdbd2cSJim Jagielski                 }
99*b1cdbd2cSJim Jagielski                 else
100*b1cdbd2cSJim Jagielski                 {
101*b1cdbd2cSJim Jagielski                     // handle it as a main thread
102*b1cdbd2cSJim Jagielski                     aExecutor.notify( Any.VOID );
103*b1cdbd2cSJim Jagielski                 }
104*b1cdbd2cSJim Jagielski             }
105*b1cdbd2cSJim Jagielski         }
106*b1cdbd2cSJim Jagielski         catch( Exception e )
107*b1cdbd2cSJim Jagielski         {
108*b1cdbd2cSJim Jagielski             e.printStackTrace();
109*b1cdbd2cSJim Jagielski         }
110*b1cdbd2cSJim Jagielski 
111*b1cdbd2cSJim Jagielski         return aExecutor.GetResult();
112*b1cdbd2cSJim Jagielski     }
113*b1cdbd2cSJim Jagielski 
MainThreadDialogExecutor( WikiDialog aWikiDialog )114*b1cdbd2cSJim Jagielski     private MainThreadDialogExecutor( WikiDialog aWikiDialog )
115*b1cdbd2cSJim Jagielski     {
116*b1cdbd2cSJim Jagielski         m_aWikiDialog = aWikiDialog;
117*b1cdbd2cSJim Jagielski     }
118*b1cdbd2cSJim Jagielski 
MainThreadDialogExecutor( XDialog xDialog )119*b1cdbd2cSJim Jagielski     private MainThreadDialogExecutor( XDialog xDialog )
120*b1cdbd2cSJim Jagielski     {
121*b1cdbd2cSJim Jagielski         m_xDialog = xDialog;
122*b1cdbd2cSJim Jagielski     }
123*b1cdbd2cSJim Jagielski 
MainThreadDialogExecutor( XDialog xDialog, boolean bClose )124*b1cdbd2cSJim Jagielski     private MainThreadDialogExecutor( XDialog xDialog, boolean bClose )
125*b1cdbd2cSJim Jagielski     {
126*b1cdbd2cSJim Jagielski         m_xDialog = xDialog;
127*b1cdbd2cSJim Jagielski         m_bClose = true;
128*b1cdbd2cSJim Jagielski         m_bCalled = true; // no yielding, asynchronous closing
129*b1cdbd2cSJim Jagielski     }
130*b1cdbd2cSJim Jagielski 
MainThreadDialogExecutor( XMessageBox xMessageBox )131*b1cdbd2cSJim Jagielski     private MainThreadDialogExecutor( XMessageBox xMessageBox )
132*b1cdbd2cSJim Jagielski     {
133*b1cdbd2cSJim Jagielski         m_xMessageBox = xMessageBox;
134*b1cdbd2cSJim Jagielski     }
135*b1cdbd2cSJim Jagielski 
GetResult()136*b1cdbd2cSJim Jagielski     private boolean GetResult()
137*b1cdbd2cSJim Jagielski     {
138*b1cdbd2cSJim Jagielski         return m_bResult;
139*b1cdbd2cSJim Jagielski     }
140*b1cdbd2cSJim Jagielski 
notify( Object aData )141*b1cdbd2cSJim Jagielski     public void notify( Object aData )
142*b1cdbd2cSJim Jagielski     {
143*b1cdbd2cSJim Jagielski         if ( m_aWikiDialog != null )
144*b1cdbd2cSJim Jagielski             m_bResult = m_aWikiDialog.show();
145*b1cdbd2cSJim Jagielski         else if ( m_xDialog != null )
146*b1cdbd2cSJim Jagielski         {
147*b1cdbd2cSJim Jagielski             if ( !m_bClose )
148*b1cdbd2cSJim Jagielski                 m_bResult = ( m_xDialog.execute() == 1 );
149*b1cdbd2cSJim Jagielski             else
150*b1cdbd2cSJim Jagielski             {
151*b1cdbd2cSJim Jagielski                 try
152*b1cdbd2cSJim Jagielski                 {
153*b1cdbd2cSJim Jagielski                     m_xDialog.endExecute();
154*b1cdbd2cSJim Jagielski                 }
155*b1cdbd2cSJim Jagielski                 catch( Exception e )
156*b1cdbd2cSJim Jagielski                 {
157*b1cdbd2cSJim Jagielski                     e.printStackTrace();
158*b1cdbd2cSJim Jagielski                 }
159*b1cdbd2cSJim Jagielski                 m_bResult = true;
160*b1cdbd2cSJim Jagielski             }
161*b1cdbd2cSJim Jagielski         }
162*b1cdbd2cSJim Jagielski         else if ( m_xMessageBox != null )
163*b1cdbd2cSJim Jagielski         {
164*b1cdbd2cSJim Jagielski             int nRes = m_xMessageBox.execute();
165*b1cdbd2cSJim Jagielski             m_bResult = ( nRes == com.sun.star.awt.MessageBoxResults.OK
166*b1cdbd2cSJim Jagielski                           || nRes == com.sun.star.awt.MessageBoxResults.YES );
167*b1cdbd2cSJim Jagielski         }
168*b1cdbd2cSJim Jagielski 
169*b1cdbd2cSJim Jagielski         m_bCalled = true;
170*b1cdbd2cSJim Jagielski     }
171*b1cdbd2cSJim Jagielski };
172*b1cdbd2cSJim Jagielski 
173