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