/************************************************************** * * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. * *************************************************************/ package com.sun.star.wizards.agenda; import java.util.Vector; import com.sun.star.awt.ItemEvent; import com.sun.star.awt.VclWindowPeerAttribute; import com.sun.star.awt.XItemListener; import com.sun.star.awt.XWindow; import com.sun.star.awt.XWindowPeer; import com.sun.star.beans.PropertyValue; import com.sun.star.frame.XStorable; import com.sun.star.lang.EventObject; import com.sun.star.lang.XMultiServiceFactory; import com.sun.star.task.XInteractionHandler; import com.sun.star.text.XTextDocument; import com.sun.star.uno.UnoRuntime; import com.sun.star.util.CloseVetoException; import com.sun.star.util.XCloseable; import com.sun.star.wizards.common.Configuration; import com.sun.star.wizards.common.Desktop; import com.sun.star.wizards.common.FileAccess; import com.sun.star.wizards.common.Helper; import com.sun.star.wizards.common.NoValidPathException; import com.sun.star.wizards.common.SystemDialog; import com.sun.star.wizards.common.HelpIds; import com.sun.star.wizards.common.PropertyNames; import com.sun.star.wizards.document.OfficeDocument; import com.sun.star.wizards.text.ViewHandler; import com.sun.star.wizards.ui.PathSelection; import com.sun.star.wizards.ui.XPathSelectionListener; import com.sun.star.wizards.ui.event.DataAware; import com.sun.star.wizards.ui.event.RadioDataAware; import com.sun.star.wizards.ui.event.UnoDataAware; /** * This class is the dialog implementation class - * there is not much business logic here - but mostley * event methods. * Some event methods are also implemented in TopicsControl and TopicsControl.ControlRow. * @author rp143992 */ public class AgendaWizardDialogImpl extends AgendaWizardDialog { /** * used to prevent a double start of the wizard. */ static boolean running; /** * the preview document controller. */ AgendaTemplate agendaTemplate; /** * the data model, read from the OOo configuration. * (live synchronized: when the user changes the gui, * the data model changes, except for topics). */ private CGAgenda agenda; /** * the topics control, a gui element which * manipulates the topics data according to the * user's input. */ private TopicsControl topicsControl; /** * an array with two array memebers: * agendaTemplates[0] contains an array with * UI template names. * agendaTemplates[1] contains an array with * corresponding URLs. */ private String[][] agendaTemplates; PathSelection myPathSelection; String sTemplatePath; String sUserTemplatePath; String sBitmapPath; String sPath; /** constructor */ public AgendaWizardDialogImpl(XMultiServiceFactory xmsf) { super(xmsf); } protected void enterStep(int OldStep, int NewStep) {} protected void leaveStep(int OldStep, int NewStep) {} /** * read the configuration data, open the specified template, * initialize the template controller (AgendaTemplate) and * set the status of the displayed template to the one * read from the configuration. * build the dialog. * Synchronize the dialog to the same status (read from * the configuration). * show the dialog. */ public void startWizard() { running = true; try { // read configuration data. agenda = new CGAgenda(); Object root = Configuration.getConfigurationRoot(xMSF, "/org.openoffice.Office.Writer/Wizards/Agenda", false); agenda.readConfiguration(root,"cp_"); // initialize the agenda template agendaTemplate = new AgendaTemplate(xMSF, agenda, resources, this); initializeTemplates(); agendaTemplate.load(agendaTemplates[1][agenda.cp_AgendaType] , new Vector()); // build the dialog. buildStep1(); buildStep2(); buildStep3(); buildStep4(); buildStep5(); topicsControl = new TopicsControl(this,xMSF, agenda); buildStep6(); drawNaviBar(); initializePaths(); //special Control for setting the save Path: insertPathSelectionControl(); // create the peer XWindow xw = agendaTemplate.xFrame.getContainerWindow(); XWindowPeer xWindowPeer = UnoRuntime.queryInterface(XWindowPeer.class, xw); this.createWindowPeer( xWindowPeer ); // initialize roadmap this.addRoadmap(); this.insertRoadMapItems( new String[] { resources.resStep1, resources.resStep2, resources.resStep3, resources.resStep4, resources.resStep5, resources.resStep6, } , new int[] { 1,2,3,4,5,6}, new boolean[] { true,true,true,true,true,true } ); this.setMaxStep(6); // synchronize GUI and CGAgenda object. makeDA(); if(myPathSelection.xSaveTextBox.getText().equalsIgnoreCase(PropertyNames.EMPTY_STRING)) {myPathSelection.initializePath();} executeDialog(agendaTemplate.xFrame); removeTerminateListener(); closeDocument(); running = false; } catch (Exception ex) { removeTerminateListener(); ex.printStackTrace(); running=false; } } private class myPathSelectionListener implements XPathSelectionListener { public void validatePath() { if (myPathSelection.usedPathPicker) { filenameChanged = true; } myPathSelection.usedPathPicker = false; } } public void insertPathSelectionControl() { myPathSelection = new PathSelection(xMSF, this, PathSelection.TransferMode.SAVE, PathSelection.DialogTypes.FILE); myPathSelection.insert(6, 97, 70, 205, (short) 45, resources.reslblTemplatePath_value, true, HelpIds.getHelpIdString( HID + 24 ), HelpIds.getHelpIdString( HID + 25 )); myPathSelection.sDefaultDirectory = sUserTemplatePath; myPathSelection.sDefaultName = "myAgendaTemplate.ott"; myPathSelection.sDefaultFilter = "writer8_template"; myPathSelection.addSelectionListener(new myPathSelectionListener()); } private void initializePaths() { try { sTemplatePath = FileAccess.getOfficePath(xMSF, "Template", "share", "/wizard"); sUserTemplatePath = FileAccess.getOfficePath(xMSF, "Template", "user", PropertyNames.EMPTY_STRING); sBitmapPath = FileAccess.combinePaths(xMSF, sTemplatePath, "/../wizard/bitmap"); } catch (NoValidPathException e) { e.printStackTrace(); } } private void checkSavePath() { if (agenda.cp_TemplatePath == null || agenda.cp_TemplatePath.equals(PropertyNames.EMPTY_STRING) || !getFileAccess().exists(FileAccess.getParentDir(agenda.cp_TemplatePath),false) || !getFileAccess().isDirectory(FileAccess.getParentDir(agenda.cp_TemplatePath ))) { try { agenda.cp_TemplatePath = FileAccess.connectURLs( FileAccess.getOfficePath(xMSF, "Work", PropertyNames.EMPTY_STRING, PropertyNames.EMPTY_STRING) , resources.resDefaultFilename ); } catch (Exception ex) { ex.printStackTrace(); } } } /** * bind controls to the agenda member (DataAware model) */ private void makeDA() { setControlProperty("listPageDesign", PropertyNames.STRING_ITEM_LIST, agendaTemplates[0]); checkSavePath(); //setFilename(agenda.cp_TemplatePath); UnoDataAware.attachListBox( agenda, "cp_AgendaType", listPageDesign , null, true ).updateUI(); UnoDataAware.attachCheckBox( agenda, "cp_IncludeMinutes", chkMinutes, null, true).updateUI(); UnoDataAware.attachEditControl(agenda, "cp_Title", txtTitle, agendaTemplate , true).updateUI(); UnoDataAware.attachDateControl(agenda, "cp_Date", txtDate, agendaTemplate , true).updateUI(); UnoDataAware.attachTimeControl(agenda, "cp_Time", txtTime, agendaTemplate , true).updateUI(); UnoDataAware.attachEditControl(agenda, "cp_Location", cbLocation, agendaTemplate , true).updateUI(); UnoDataAware.attachCheckBox(agenda,"cp_ShowMeetingType", chkMeetingTitle , new RedrawListener( TemplateConsts.FILLIN_MEETING_TYPE ) , true); UnoDataAware.attachCheckBox(agenda,"cp_ShowRead", chkRead , new RedrawListener( TemplateConsts.FILLIN_READ ) , true).updateUI(); UnoDataAware.attachCheckBox(agenda,"cp_ShowBring", chkBring , new RedrawListener( TemplateConsts.FILLIN_BRING ) , true).updateUI(); UnoDataAware.attachCheckBox(agenda,"cp_ShowNotes", chkNotes , new RedrawListener( TemplateConsts.FILLIN_NOTES ) , true).updateUI(); UnoDataAware.attachCheckBox(agenda,"cp_ShowCalledBy", chkConvenedBy , new RedrawListener( TemplateConsts.FILLIN_CALLED_BY ) , true).updateUI(); UnoDataAware.attachCheckBox(agenda,"cp_ShowFacilitator", chkPresiding , new RedrawListener( TemplateConsts.FILLIN_FACILITATOR ) , true).updateUI(); UnoDataAware.attachCheckBox(agenda,"cp_ShowNotetaker", chkNoteTaker , new RedrawListener( TemplateConsts.FILLIN_NOTETAKER ) , true).updateUI(); UnoDataAware.attachCheckBox(agenda,"cp_ShowTimekeeper", chkTimekeeper , new RedrawListener( TemplateConsts.FILLIN_TIMEKEEPER ) , true).updateUI(); UnoDataAware.attachCheckBox(agenda,"cp_ShowAttendees", chkAttendees , new RedrawListener( TemplateConsts.FILLIN_PARTICIPANTS ) , true).updateUI(); UnoDataAware.attachCheckBox(agenda,"cp_ShowObservers", chkObservers , new RedrawListener( TemplateConsts.FILLIN_OBSERVERS ) , true).updateUI(); UnoDataAware.attachCheckBox(agenda,"cp_ShowResourcePersons", chkResourcePersons , new RedrawListener( TemplateConsts.FILLIN_RESOURCE_PERSONS ) , true).updateUI(); UnoDataAware.attachEditControl(agenda, "cp_TemplateName", txtTemplateName, null, true).updateUI(); RadioDataAware.attachRadioButtons( agenda, "cp_ProceedMethod", new Object[] {optCreateAgenda, optMakeChanges} ,null,true).updateUI(); listPageDesign.addItemListener(new XItemListener() { public void itemStateChanged(ItemEvent ie) { pageDesignChanged(ie); } public void disposing(EventObject eo) {} }); } /** used in development to start the wizard */ public static void main(String args[]) { String ConnectStr = "uno:socket,host=127.0.0.1,port=8100;urp,negotiate=0,forcesynchronous=1;StarOffice.ServiceManager"; try { XMultiServiceFactory xLocMSF = Desktop.connect(ConnectStr); AgendaWizardDialogImpl wizard = new AgendaWizardDialogImpl(xLocMSF); wizard.startWizard(); } catch (Exception exception) { exception.printStackTrace(); } } /* private void initializePaths() { try { sUserTemplatePath = FileAccess.getOfficePath(xMSF, "Template", "user"); sBitmapPath = FileAccess.combinePaths(xMSF, sTemplatePath, "/../wizard/bitmap"); } catch (NoValidPathException e) { e.printStackTrace(); } }*/ /** * read the available agenda wizard templates. */ public boolean initializeTemplates() { try { String sTemplatePath = FileAccess.getOfficePath(xMSF, "Template", "share", "/wizard"); //sCurrentNorm = Norms[getCurrentLetter().cp_Norm]; String sAgendaPath = FileAccess.combinePaths(xMSF, sTemplatePath, "/wizard/agenda" ); agendaTemplates = FileAccess.getFolderTitles(xMSF, "aw" , sAgendaPath); return true; } catch (NoValidPathException nopathexception) { nopathexception.printStackTrace(); return false; } catch (Exception exception) { exception.printStackTrace(); return false; } } /* ****************************** * Event methods * ****************************** */ /** * first page, page design listbox changed. */ public void pageDesignChanged(ItemEvent ie) { int selected = ie.Selected; try { agendaTemplate.load( agendaTemplates[1][selected] , topicsControl.getTopicsData()); } catch (Exception ex) { SystemDialog.showMessageBox(xMSF, "ErrBox", VclWindowPeerAttribute.OK, resources.resErrOpenTemplate); ex.printStackTrace(); } } /** * last page, template title changed... */ public void templateTitleChanged() { String title = (String)Helper.getUnoPropertyValue( getModel(txtTemplateName), "Text" ); agendaTemplate.setTemplateTitle( title ); } private FileAccess fileAccess1; /** convenience method. * instead of creating a FileAccess object every time * it is needed, I have a FileAccess object member. * the first time it is needed it will be created, and * then be reused... * @return the FileAccess member object. */ private FileAccess getFileAccess() { if (fileAccess1 == null) try { fileAccess1 = new FileAccess(xMSF); } catch (Exception e) { e.printStackTrace(); } return fileAccess1; } /** * indicates if the filename was changed by the user through * the "save as" dialog. * If it is so, one needs not warn the user * upon overwrite, since she was already warned. */ private boolean filenameChanged = false; /** * last page, "browse" ("...") button was clicked... */ public void saveAs() { try { checkSavePath(); SystemDialog saveAs = SystemDialog.createStoreDialog(xMSF); saveAs.addFilterToDialog("ott","writer8_template",true); // call the saveAs dialog. String url = saveAs.callStoreDialog( FileAccess.getParentDir(agenda.cp_TemplatePath), FileAccess.getFilename(agenda.cp_TemplatePath)); if (url != null) { agenda.cp_TemplatePath = url; setFilename(url); filenameChanged = true; } } catch (Exception ex) { ex.printStackTrace(); } } /** * is called when the user * changes the path through the "save as" dialog. * The path displayed is a translated, user-friendly, platform dependent path. * @param url the new save url. */ private void setFilename(String url) { try { String path = getFileAccess().getPath(url,PropertyNames.EMPTY_STRING); Helper.setUnoPropertyValue( getModel(myPathSelection.xSaveTextBox), "Text", path); } catch (Exception ex) { ex.printStackTrace(); } } public void insertRow() { topicsControl.insertRow(); } public void removeRow() { topicsControl.removeRow(); } public void rowUp() { topicsControl.rowUp(); } public void rowDown() { topicsControl.rowDown(); } /* ************************ * Navigation bar methods * ************************ */ public void cancelWizard() { xDialog.endExecute(); running = false; } public boolean finishWizard() { boolean bSaveSuccess = false; // pesimistic :( XTextDocument xTextDocument; try { FileAccess fileAccess = new FileAccess(xMSF); sPath = myPathSelection.getSelectedPath(); if (sPath.equals(PropertyNames.EMPTY_STRING)) { myPathSelection.triggerPathPicker(); sPath = myPathSelection.getSelectedPath(); } sPath = fileAccess.getURL(sPath); //first, if the filename was not changed, thus //it is coming from a saved session, check if the // file exists and warn the user. if (!filenameChanged) if (fileAccess.exists(sPath, true)) { int answer = SystemDialog.showMessageBox(xMSF, xControl.getPeer(), "MessBox", VclWindowPeerAttribute.YES_NO + VclWindowPeerAttribute.DEF_NO, resources.resFileExists); if (answer == 3) // user said: no, do not overwrite.... return false; } agendaTemplate.xTextDocument.lockControllers(); xTextDocument = UnoRuntime.queryInterface(XTextDocument.class,agendaTemplate.document); bSaveSuccess = OfficeDocument.store(xMSF, xTextDocument, sPath , "writer8_template", false ); } catch (Exception e) { SystemDialog.showMessageBox(xMSF, xControl.getPeer(), "ErrBox", VclWindowPeerAttribute.OK, resources.resErrSaveTemplate); //e.printStackTrace(); } if (bSaveSuccess) { try { topicsControl.saveTopics(agenda); Object root = Configuration.getConfigurationRoot(xMSF, "/org.openoffice.Office.Writer/Wizards/Agenda", true); agenda.writeConfiguration(root,"cp_"); Configuration.commit(root); } catch (Exception ex) { ex.printStackTrace(); } agendaTemplate.finish( topicsControl.getTopicsData()); try { XStorable xStoreable = UnoRuntime.queryInterface(XStorable.class, agendaTemplate.document); xStoreable.store(); } catch (Exception ex) { SystemDialog.showMessageBox(xMSF, "ErrBox", VclWindowPeerAttribute.OK, resources.resErrSaveTemplate); ex.printStackTrace(); } //xWindow.setVisible(false); //running = false; agendaTemplate.xTextDocument.unlockControllers(); //closeDocument(); //removeTerminateListener(); PropertyValue loadValues[] = new PropertyValue[2]; loadValues[0] = new PropertyValue(); loadValues[0].Name = "AsTemplate"; if (agenda.cp_ProceedMethod == 1) { loadValues[0].Value = Boolean.TRUE; } else { loadValues[0].Value = Boolean.FALSE; } loadValues[1] = new PropertyValue(); loadValues[1].Name = "InteractionHandler"; try { loadValues[1].Value = UnoRuntime.queryInterface(XInteractionHandler.class, xMSF.createInstance("com.sun.star.comp.uui.UUIInteractionHandler")); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } //Object oDoc = OfficeDocument.load(Desktop.getDesktop(xMSF), agenda.cp_TemplatePath, "_default", new PropertyValue[0]); Object oDoc = OfficeDocument.load(Desktop.getDesktop(xMSF), sPath, "_default", new PropertyValue[0]); xTextDocument = (com.sun.star.text.XTextDocument) oDoc; XMultiServiceFactory xDocMSF = UnoRuntime.queryInterface(XMultiServiceFactory.class, xTextDocument); ViewHandler myViewHandler = new ViewHandler(xDocMSF, xTextDocument); try { myViewHandler.setViewSetting("ZoomType", new Short(com.sun.star.view.DocumentZoomType.OPTIMAL)); } catch (Exception ex) { ex.printStackTrace(); } } else { agendaTemplate.xTextDocument.unlockControllers(); return false; } xDialog.endExecute(); running = false; return true; } private void closeDocument() { try { //xComponent.dispose(); XCloseable xCloseable = UnoRuntime.queryInterface(XCloseable.class, agendaTemplate.xFrame); xCloseable.close(false); } catch (CloseVetoException e) { e.printStackTrace(); } } /* ******************** * Sub Classes * ******************** */ /** * this class is used to redraw an item's table when * the user clicks one of the checkboxes in step 3 or 4. */ private class RedrawListener implements DataAware.Listener { private String itemName; public RedrawListener(String itemName_) { itemName = itemName_; } /* (non-Javadoc) * @see com.sun.star.wizards.ui.event.DataAware.Listener#eventPerformed(java.lang.Object) */ public void eventPerformed(Object event) { agendaTemplate.xTextDocument.lockControllers(); agendaTemplate.redraw(itemName); agendaTemplate.xTextDocument.unlockControllers(); } } }