| /************************************************************** |
| * |
| * 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 developement 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 memeber. |
| * the first time it is needed it will be created, and |
| * then be reused... |
| * @return the FileAccess memeber 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 dependant 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(); |
| } |
| } |
| |
| |
| } |
| |