/************************************************************************* * * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * Copyright 2000, 2010 Oracle and/or its affiliates. * * OpenOffice.org - a multi-platform office productivity suite * * This file is part of OpenOffice.org. * * OpenOffice.org is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 3 * only, as published by the Free Software Foundation. * * OpenOffice.org is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License version 3 for more details * (a copy is included in the LICENSE file that accompanied this code). * * You should have received a copy of the GNU Lesser General Public License * version 3 along with OpenOffice.org. If not, see * * for a copy of the LGPLv3 License. * ************************************************************************/ package com.sun.star.wizards.ui; import java.beans.*; import com.sun.star.wizards.ui.event.CommonListener; import com.sun.star.wizards.ui.event.EventNames; import com.sun.star.wizards.ui.event.MethodInvocation; import com.sun.star.uno.UnoRuntime; import com.sun.star.awt.*; import com.sun.star.uno.AnyConverter; import com.sun.star.uno.XInterface; import com.sun.star.lang.EventObject; import com.sun.star.lang.XSingleServiceFactory; import com.sun.star.lang.XMultiServiceFactory; import com.sun.star.wizards.common.Desktop; import com.sun.star.wizards.common.Helper; import com.sun.star.wizards.common.Resource; import com.sun.star.container.XIndexContainer; import com.sun.star.frame.XTerminateListener; import com.sun.star.frame.TerminationVetoException; import com.sun.star.lang.IllegalArgumentException; import com.sun.star.beans.*; import com.sun.star.wizards.common.HelpIds; import com.sun.star.wizards.common.PropertyNames; public abstract class WizardDialog extends UnoDialog2 implements VetoableChangeListener, XTerminateListener, XCompletion { private static final String NEXT_ACTION_PERFORMED = "gotoNextAvailableStep"; private static final String BACK_ACTION_PERFORMED = "gotoPreviousAvailableStep"; private static final String FINISH_ACTION_PERFORMED = "finishWizard_1"; private static final String CANCEL_ACTION_PERFORMED = "cancelWizard_1"; private static final String HELP_ACTION_PERFORMED = "callHelp"; public VetoableChangeSupport vetos = new VetoableChangeSupport(this); private String[] sRightPaneHeaders; private int iButtonWidth = 50; private int nNewStep = 1; private int nOldStep = 1; private int nMaxStep = 1; protected XItemListener RoadmapItemListener; protected XControl xRoadmapControl; XItemEventBroadcaster xRoadmapBroadcaster; String[] sRMItemLabels; private Object oRoadmap; private XSingleServiceFactory xSSFRoadmap; public XIndexContainer xIndexContRoadmap; private Resource oWizardResource; public String sMsgEndAutopilot; private int hid; private boolean bTerminateListenermustberemoved = true; /** Creates a new instance of WizardDialog * the hid is used as following : * "HID:(hid)" - the dialog * "HID:(hid+1) - the help button * "HID:(hid+2)" - the back button * "HID:(hid+3)" - the next button * "HID:(hid+4)" - the create button * "HID:(hid+5)" - the cancel button * @param xMSF * @param hid_ */ public WizardDialog(XMultiServiceFactory xMSF, int hid_) { super(xMSF); hid = hid_; oWizardResource = new Resource(xMSF, "Common", "dbw"); sMsgEndAutopilot = oWizardResource.getResText(UIConsts.RID_DB_COMMON + 33); //new Resource(xMSF,"Common","com"); } /** * * @return */ public Resource getResource() { return oWizardResource; } public void activate() { try { XTopWindow top = UnoRuntime.queryInterface(XTopWindow.class, xWindow); if (top != null) { top.toFront(); } } catch (Exception ex) { // do nothing; } } public void setMaxStep(int i) { nMaxStep = i; } public int getMaxStep() { return nMaxStep; } public void setOldStep(int i) { nOldStep = i; } public int getOldStep() { return nOldStep; } public void setNewStep(int i) { nNewStep = i; } public int getNewStep() { return nNewStep; } /** * @see java.beans.VetoableChangeListener#vetoableChange(java.beans.PropertyChangeEvent) */ public void vetoableChange(java.beans.PropertyChangeEvent arg0) { nNewStep = nOldStep; } public void itemStateChanged(com.sun.star.awt.ItemEvent itemEvent) { try { nNewStep = itemEvent.ItemId; nOldStep = AnyConverter.toInt(Helper.getUnoPropertyValue(xDialogModel, PropertyNames.PROPERTY_STEP)); if (nNewStep != nOldStep) { switchToStep(); } } catch (com.sun.star.lang.IllegalArgumentException exception) { exception.printStackTrace(System.out); } } public void setRoadmapInteractive(boolean _bInteractive) { Helper.setUnoPropertyValue(oRoadmap, "Activated", Boolean.valueOf(_bInteractive)); } public void setRoadmapComplete(boolean bComplete) { Helper.setUnoPropertyValue(oRoadmap, "Complete", Boolean.valueOf(bComplete)); } public boolean isRoadmapComplete() { try { return AnyConverter.toBoolean(Helper.getUnoPropertyValue(oRoadmap, "Complete")); } catch (IllegalArgumentException exception) { exception.printStackTrace(System.out); return false; } } public void setCurrentRoadmapItemID(short ID) { if (oRoadmap != null) { int nCurItemID = getCurrentRoadmapItemID(); if (nCurItemID != ID) { Helper.setUnoPropertyValue(oRoadmap, "CurrentItemID", new Short(ID)); } } } public int getCurrentRoadmapItemID() { try { return AnyConverter.toInt(Helper.getUnoPropertyValue(oRoadmap, "CurrentItemID")); } catch (com.sun.star.uno.Exception exception) { exception.printStackTrace(System.out); return -1; } } public void addRoadmap() { try { int iDialogHeight = ((Integer) Helper.getUnoPropertyValue(this.xDialogModel, PropertyNames.PROPERTY_HEIGHT)).intValue(); // the roadmap control has got no real TabIndex ever // that is not correct, but changing this would need time, so it is used // without TabIndex as before oRoadmap = insertControlModel("com.sun.star.awt.UnoControlRoadmapModel", "rdmNavi", new String[] { PropertyNames.PROPERTY_HEIGHT, PropertyNames.PROPERTY_POSITION_X, PropertyNames.PROPERTY_POSITION_Y, PropertyNames.PROPERTY_STEP, PropertyNames.PROPERTY_TABINDEX, "Tabstop", PropertyNames.PROPERTY_WIDTH }, new Object[] { new Integer(iDialogHeight - 26), 0, 0, 0, new Short((short)0), Boolean.TRUE, 85 }); XPropertySet xPSet = UnoRuntime.queryInterface(XPropertySet.class, oRoadmap); xPSet.setPropertyValue(PropertyNames.PROPERTY_NAME, "rdmNavi"); xSSFRoadmap = UnoRuntime.queryInterface(XSingleServiceFactory.class, oRoadmap); xIndexContRoadmap = UnoRuntime.queryInterface(XIndexContainer.class, oRoadmap); // XPropertySet xPropRoadmapModel = (XPropertySet) UnoRuntime.queryInterface(XPropertySet.class, oRoadmap); // xPropRoadmapModel.addPropertyChangeListener("CurrentItemID", new WizardDialog.RoadmapItemListener(this.xDialogModel)); MethodInvocation mi = new MethodInvocation("itemStateChanged", this, com.sun.star.awt.ItemEvent.class); getGuiEventListener().add("rdmNavi", EventNames.EVENT_ITEM_CHANGED, mi); xRoadmapControl = this.xDlgContainer.getControl("rdmNavi"); xRoadmapBroadcaster = UnoRuntime.queryInterface(XItemEventBroadcaster.class, xRoadmapControl); xRoadmapBroadcaster.addItemListener((XItemListener) getGuiEventListener()); // xRoadmapControl = this.xDlgContainer.getControl("rdmNavi"); // xRoadmapBroadcaster.addItemListener(new RoadmapItemListener()); Helper.setUnoPropertyValue(oRoadmap, "Text", oWizardResource.getResText(UIConsts.RID_COMMON + 16)); } catch (NoSuchMethodException ex) { Resource.showCommonResourceError(xMSF); } catch (java.lang.Exception jexception) { jexception.printStackTrace(System.out); } } public void setRMItemLabels(Resource _oResource, int StartResID) { sRMItemLabels = _oResource.getResArray(StartResID, nMaxStep); } public String[] getRMItemLabels() { return sRMItemLabels; } /* public void insertRoadmapItems(int StartIndex, int RMCount) { Object oRoadmapItem; boolean bEnabled; for (int i = StartIndex; i < (StartIndex + RMCount); i++) insertSingleRoadmapItem(i, true, sRMItemLabels[i], i); }*/ public int insertRoadmapItem(int _Index, boolean _bEnabled, int _LabelID, int _CurItemID) { return insertRoadmapItem(_Index, _bEnabled, sRMItemLabels[_LabelID], _CurItemID); } public int insertRoadmapItem(int Index, boolean _bEnabled, String _sLabel, int _CurItemID) { try { Object oRoadmapItem = xSSFRoadmap.createInstance(); Helper.setUnoPropertyValue(oRoadmapItem, PropertyNames.PROPERTY_LABEL, _sLabel); Helper.setUnoPropertyValue(oRoadmapItem, PropertyNames.PROPERTY_ENABLED, Boolean.valueOf(_bEnabled)); Helper.setUnoPropertyValue(oRoadmapItem, "ID", new Integer(_CurItemID)); xIndexContRoadmap.insertByIndex(Index, oRoadmapItem); return Index + 1; } catch (com.sun.star.uno.Exception exception) { exception.printStackTrace(System.out); return -1; } } public int getRMItemCount() { return xIndexContRoadmap.getCount(); } public XInterface getRoadmapItemByID(int _ID) { try { int CurID; XInterface CurRoadmapItem; for (int i = 0; i < xIndexContRoadmap.getCount(); i++) { CurRoadmapItem = (XInterface) xIndexContRoadmap.getByIndex(i); CurID = AnyConverter.toInt(Helper.getUnoPropertyValue(CurRoadmapItem, "ID")); if (CurID == _ID) { return CurRoadmapItem; } } return null; } catch (com.sun.star.uno.Exception exception) { exception.printStackTrace(System.out); return null; } } public boolean switchToStep(int _nOldStep, int _nNewStep) { nOldStep = _nOldStep; nNewStep = _nNewStep; return switchToStep(); } private boolean switchToStep() { leaveStep(nOldStep, nNewStep); if (nNewStep != nOldStep) { if (nNewStep == nMaxStep) { setControlProperty("btnWizardNext", "DefaultButton", Boolean.FALSE); setControlProperty("btnWizardFinish", "DefaultButton", Boolean.TRUE); } else { setControlProperty("btnWizardNext", "DefaultButton", Boolean.TRUE); setControlProperty("btnWizardFinish", "DefaultButton", Boolean.FALSE); } changeToStep(nNewStep); enterStep(nOldStep, nNewStep); return true; } return false; } abstract protected void leaveStep(int nOldStep, int nNewStep); abstract protected void enterStep(int nOldStep, int nNewStep); protected void changeToStep(int nNewStep) { Helper.setUnoPropertyValue(xDialogModel, PropertyNames.PROPERTY_STEP, new Integer(nNewStep)); setCurrentRoadmapItemID((short) (nNewStep)); enableNextButton(getNextAvailableStep() > 0); enableBackButton(nNewStep != 1); } /* (non-Javadoc) * @see com.sun.star.wizards.ui.XCompletion#iscompleted(int) */ /** * * @param _ndialogpage * @return */ public boolean iscompleted(int _ndialogpage) { return false; } /* (non-Javadoc) * @see com.sun.star.wizards.ui.XCompletion#ismodified(int) */ /** * * @param _ndialogpage * @return */ public boolean ismodified(int _ndialogpage) { return false; } /* (non-Javadoc) * @see com.sun.star.wizards.ui.XCompletion#setcompleted(int, boolean) */ /** * * @param _ndialogpage * @param _biscompleted */ public void setcompleted(int _ndialogpage, boolean _biscompleted) { } /* (non-Javadoc) * @see com.sun.star.wizards.ui.XCompletion#setmodified(int, java.lang.Object, java.lang.Object) */ /** * * @param _ndialogpage * @param ooldValue * @param onewValue */ public void setmodified(int _ndialogpage, Object ooldValue, Object onewValue) { } public void drawNaviBar() { try { short curtabindex = UIConsts.SOFIRSTWIZARDNAVITABINDEX; Integer IButtonWidth = new Integer(iButtonWidth); int iButtonHeight = 14; Integer IButtonHeight = new Integer(iButtonHeight); Integer ICurStep = 0; int iDialogHeight = ((Integer) Helper.getUnoPropertyValue(this.xDialogModel, PropertyNames.PROPERTY_HEIGHT)).intValue(); int iDialogWidth = ((Integer) Helper.getUnoPropertyValue(this.xDialogModel, PropertyNames.PROPERTY_WIDTH)).intValue(); int iHelpPosX = 8; int iBtnPosY = iDialogHeight - iButtonHeight - 6; int iCancelPosX = iDialogWidth - iButtonWidth - 6; int iFinishPosX = iCancelPosX - 6 - iButtonWidth; int iNextPosX = iFinishPosX - 6 - iButtonWidth; int iBackPosX = iNextPosX - 3 - iButtonWidth; insertControlModel("com.sun.star.awt.UnoControlFixedLineModel", "lnNaviSep", new String[] { PropertyNames.PROPERTY_HEIGHT, PropertyNames.ORIENTATION, PropertyNames.PROPERTY_POSITION_X, PropertyNames.PROPERTY_POSITION_Y, PropertyNames.PROPERTY_STEP, PropertyNames.PROPERTY_WIDTH }, new Object[] { 1, 0, 0, new Integer(iDialogHeight - 26), ICurStep, new Integer(iDialogWidth) }); insertControlModel("com.sun.star.awt.UnoControlFixedLineModel", "lnRoadSep", new String[] { PropertyNames.PROPERTY_HEIGHT, PropertyNames.ORIENTATION, PropertyNames.PROPERTY_POSITION_X, PropertyNames.PROPERTY_POSITION_Y, PropertyNames.PROPERTY_STEP, PropertyNames.PROPERTY_WIDTH }, new Object[] { new Integer(iBtnPosY - 6), 1, 85, 0, ICurStep, 1 }); String[] propNames = new String[] { PropertyNames.PROPERTY_ENABLED, PropertyNames.PROPERTY_HEIGHT, PropertyNames.PROPERTY_HELPURL, PropertyNames.PROPERTY_LABEL, PropertyNames.PROPERTY_POSITION_X, PropertyNames.PROPERTY_POSITION_Y, "PushButtonType", PropertyNames.PROPERTY_STEP, PropertyNames.PROPERTY_TABINDEX, PropertyNames.PROPERTY_WIDTH }; Helper.setUnoPropertyValue(super.xDialogModel, PropertyNames.PROPERTY_HELPURL, HelpIds.getHelpIdString(hid)); insertButton("btnWizardHelp", HELP_ACTION_PERFORMED, new String[] { PropertyNames.PROPERTY_ENABLED, PropertyNames.PROPERTY_HEIGHT, PropertyNames.PROPERTY_LABEL, PropertyNames.PROPERTY_POSITION_X, PropertyNames.PROPERTY_POSITION_Y, "PushButtonType", PropertyNames.PROPERTY_STEP, PropertyNames.PROPERTY_TABINDEX, PropertyNames.PROPERTY_WIDTH }, new Object[] { true, IButtonHeight, oWizardResource.getResText(UIConsts.RID_COMMON + 15), new Integer(iHelpPosX), new Integer(iBtnPosY), new Short((short) PushButtonType.HELP_value), ICurStep, new Short(curtabindex++), IButtonWidth }); insertButton("btnWizardBack", BACK_ACTION_PERFORMED, propNames, new Object[] { false, IButtonHeight, HelpIds.getHelpIdString(hid + 2), oWizardResource.getResText(UIConsts.RID_COMMON + 13), new Integer(iBackPosX), new Integer(iBtnPosY), new Short((short) PushButtonType.STANDARD_value), ICurStep, new Short(curtabindex++), IButtonWidth }); insertButton("btnWizardNext", NEXT_ACTION_PERFORMED, propNames, new Object[] { true, IButtonHeight, HelpIds.getHelpIdString(hid + 3), oWizardResource.getResText(UIConsts.RID_COMMON + 14), new Integer(iNextPosX), new Integer(iBtnPosY), new Short((short) PushButtonType.STANDARD_value), ICurStep, new Short(curtabindex++), IButtonWidth }); insertButton("btnWizardFinish", FINISH_ACTION_PERFORMED, propNames, new Object[] { true, IButtonHeight, HelpIds.getHelpIdString(hid + 4), oWizardResource.getResText(UIConsts.RID_COMMON + 12), new Integer(iFinishPosX), new Integer(iBtnPosY), new Short((short) PushButtonType.STANDARD_value), ICurStep, new Short(curtabindex++), IButtonWidth }); insertButton("btnWizardCancel", CANCEL_ACTION_PERFORMED, propNames, new Object[] { true, IButtonHeight, HelpIds.getHelpIdString(hid + 5), oWizardResource.getResText(UIConsts.RID_COMMON + 11), new Integer(iCancelPosX), new Integer(iBtnPosY), new Short((short) PushButtonType.STANDARD_value), ICurStep, new Short(curtabindex++), IButtonWidth }); setControlProperty("btnWizardNext", "DefaultButton", Boolean.TRUE); // add a window listener, to know // if the user used "escape" key to // close the dialog. MethodInvocation windowHidden = new MethodInvocation("windowHidden", this); xWindow.addWindowListener((CommonListener) getGuiEventListener()); String dialogName = (String) Helper.getUnoPropertyValue(xDialogModel, PropertyNames.PROPERTY_NAME); getGuiEventListener().add(dialogName, EVENT_ACTION_PERFORMED, windowHidden); } catch (java.lang.Exception jexception) { jexception.printStackTrace(System.out); } } protected void insertRoadMapItems(String[] items, int[] steps, boolean[] enabled) { for (int i = 0; i < items.length; i++) { insertRoadmapItem(i, enabled[i], items[i], steps[i]); } } /** This method also enables and disables the "next" button, * if the step currently dis/enabled is the one of the next steps. * @param _nStep * @param bEnabled * @param enableNextButton */ public void setStepEnabled(int _nStep, boolean bEnabled, boolean enableNextButton) { setStepEnabled(_nStep, bEnabled); if (getNextAvailableStep() > 0) { enableNextButton(bEnabled); } } public void enableNavigationButtons(boolean _bEnableBack, boolean _bEnableNext, boolean _bEnableFinish) { enableBackButton(_bEnableBack); enableNextButton(_bEnableNext); enableFinishButton(_bEnableFinish); } public void enableBackButton(boolean enabled) { setControlProperty("btnWizardBack", PropertyNames.PROPERTY_ENABLED, enabled ? Boolean.TRUE : Boolean.FALSE); } public void enableNextButton(boolean enabled) { setControlProperty("btnWizardNext", PropertyNames.PROPERTY_ENABLED, enabled ? Boolean.TRUE : Boolean.FALSE); } public void enableFinishButton(boolean enabled) { setControlProperty("btnWizardFinish", PropertyNames.PROPERTY_ENABLED, enabled ? Boolean.TRUE : Boolean.FALSE); } public void setStepEnabled(int _nStep, boolean bEnabled) { XInterface xRoadmapItem = getRoadmapItemByID(_nStep); if (xRoadmapItem != null) { Helper.setUnoPropertyValue(xRoadmapItem, PropertyNames.PROPERTY_ENABLED, Boolean.valueOf(bEnabled)); } } public void enablefromStep(int _iStep, boolean _bDoEnable) { if (_iStep <= this.nMaxStep) { for (int i = _iStep; i <= nMaxStep; i++) { setStepEnabled(i, _bDoEnable); } enableFinishButton(_bDoEnable); if (!_bDoEnable) { enableNextButton(_iStep > getCurrentStep() + 1); } else { enableNextButton(!(getCurrentStep() == nMaxStep)); } } } public boolean isStepEnabled(int _nStep) { try { boolean bIsEnabled; XInterface xRoadmapItem = getRoadmapItemByID(_nStep); if (xRoadmapItem == null) // Todo: In this case an exception should be thrown { return false; } bIsEnabled = AnyConverter.toBoolean(Helper.getUnoPropertyValue(xRoadmapItem, PropertyNames.PROPERTY_ENABLED)); return bIsEnabled; } catch (com.sun.star.uno.Exception exception) { exception.printStackTrace(System.out); return false; } } public synchronized void gotoPreviousAvailableStep() { boolean bIsEnabled; if (nNewStep > 1) { nOldStep = nNewStep; nNewStep--; while (nNewStep > 0) { bIsEnabled = isStepEnabled(nNewStep); if (bIsEnabled) { break; } nNewStep--; } if (nNewStep == 0) // Exception??? { nNewStep = nOldStep; } switchToStep(); } } //TODO discuss with rp protected int getNextAvailableStep() { if (isRoadmapComplete()) { for (int i = nNewStep + 1; i <= nMaxStep; i++) { if (isStepEnabled(i)) { return i; } } } return -1; } public synchronized void gotoNextAvailableStep() { nOldStep = nNewStep; nNewStep = getNextAvailableStep(); if (nNewStep > -1) { switchToStep(); } } public abstract boolean finishWizard(); /** * This function will call if the finish button is pressed on the UI. */ public void finishWizard_1() { enableFinishButton(false); boolean success = false; try { success = finishWizard(); } finally { if ( !success ) enableFinishButton( true ); } if ( success ) removeTerminateListener(); } public int getMaximalStep() { return this.nMaxStep; } public int getCurrentStep() { try { return AnyConverter.toInt(Helper.getUnoPropertyValue(this.MSFDialogModel, PropertyNames.PROPERTY_STEP)); } catch (com.sun.star.uno.Exception exception) { exception.printStackTrace(System.out); return -1; } } public void setCurrentStep(int _nNewstep) { nNewStep = _nNewstep; changeToStep(nNewStep); } public void setRightPaneHeaders(Resource _oResource, int StartResID, int _nMaxStep) { String[] sRightPaneHeaders = _oResource.getResArray(StartResID, _nMaxStep); setRightPaneHeaders(sRightPaneHeaders); } public void setRightPaneHeaders(String[] _sRightPaneHeaders) { this.nMaxStep = _sRightPaneHeaders.length; this.sRightPaneHeaders = _sRightPaneHeaders; FontDescriptor oFontDesc = new FontDescriptor(); oFontDesc.Weight = com.sun.star.awt.FontWeight.BOLD; for (int i = 0; i < sRightPaneHeaders.length; i++) { insertLabel("lblQueryTitle" + String.valueOf(i), new String[] { PropertyNames.FONT_DESCRIPTOR, PropertyNames.PROPERTY_HEIGHT, PropertyNames.PROPERTY_LABEL, PropertyNames.PROPERTY_MULTILINE, PropertyNames.PROPERTY_POSITION_X, PropertyNames.PROPERTY_POSITION_Y, PropertyNames.PROPERTY_STEP, PropertyNames.PROPERTY_TABINDEX, PropertyNames.PROPERTY_WIDTH }, new Object[] { oFontDesc, 16, sRightPaneHeaders[i], Boolean.TRUE, 91, 8, new Integer(i + 1), new Short((short) 12), 212 }); } } public void cancelWizard() { //can be overwritten by extending class xDialog.endExecute(); } public void callHelp() { //should be overwritten by extending class } public void removeTerminateListener() { if (bTerminateListenermustberemoved) { Desktop.getDesktop(xMSF).removeTerminateListener(this); bTerminateListenermustberemoved = false; } } /** * called by the cancel button and * by the window hidden event. * if this method was not called before, * perform a cancel. */ public void cancelWizard_1() { cancelWizard(); removeTerminateListener(); } public void windowHidden() { cancelWizard_1(); } public void notifyTermination(EventObject arg0) { cancelWizard_1(); } public void queryTermination(EventObject arg0) throws TerminationVetoException { activate(); throw new TerminationVetoException(); } public void disposing(EventObject arg0) { cancelWizard_1(); } }