Mit JAVA ( OO API ) Text / Writer Dokumente erstellen ändern

Programmierung unter AOO/LO (StarBasic, Python, Java, ...)

Moderator: Moderatoren

berli2
Beiträge: 3
Registriert: Mi, 22.03.2006 13:10

Mit JAVA ( OO API ) Text / Writer Dokumente erstellen ändern

Beitrag von berli2 »

Hallo, sehr wahrscheinlich erfinde ich das Rad neu, bzw besser gesagt ich sehe den Baum vor lauter Wald nicht mehr.

Nachdem ich das Forum durchforstet habe, irgendwie aber nicht die Lösung oder nur "kleine" Anästze gefunden haben, hier nun meine Frage(n).

Die Java Anwendung soll Dokumente (Vorlagen werden zu Berichte) bearbeiten. Es gibt drei Fälle: erster Fall, von der Anwendung wird in das Dokument variable Daten eingefügt und gespeichert. Zweiter Fall: Das Dokument steht dem Anwender anschließend zur Bearbeitung zur Verfügung. Im 3 Fall werden variabel Werte und Textbaustein eingefügt und der Anwender gibt anschließend weiteren Text ein. In allen Fällen wird das Dokument abschließend gespeichert, bei einer erneuten Bearbeitung über die JAVA Anwendung wird das Dokument ggf. aktualisiert. Bei den variablen Werten (meist nur ein String) und den Bausteinen (Titel und mehrzeiliger Inhalt) geschiet dieses erneut durch die Anwendung, die vom Anwender "manuell" hinzugefügte Textpagen sind erhalten geblieben (gespeichertes Dokument) und können ggf vom Anwender "upgedatet" werden.

Mein jetziger Ansatz mit Bookmarks (für die variablen Felder) klappt ganz gut, die Textbausteine füge ich entsprechen am Ende des Dokumentes ein. Für das "erste" Bearbeiten ist das auch ok, bei nachfogenden Bearbeitungen werden die "Texte" (logischerweise) verdoppelt (Dokuemnt wurde ja bereits mit diesen Wert gespeichert), dieses ist also nicht wünschenswert. Also ein neuen Ansatz suchen...

Meine Gedanke geht nun dahin, das ich die Vorlage mit "versteckten" Tags füttere, ein Anfangstag und ein Endtag. Zum Beispiel "<%[KUERZEL]> ... <%/[KUERZEL]> / <%/>". Die automatische Verarbeitung würde dann entsprechende Anfangstag und das dazugehörige Endtag suchen, den Bereich dazwischen aktualisieren (löschen/neueinfügen). Somit weist das Dokument jeweils den aktuellen Inhalt auf, zumindest was die Daten aus den Anwendung angeht.

Wünschenswert wäre auch das Erzeugen der Tags (im besonderen als "versteckten" Text), aber das kommt später.

Zur Zeit versuche ich über das aktuelle SDK (2..) von OO an entsprechendes Hinetrgrundwissen zu kommen, leider entwickelt sich die so langsam zum "Wald" in dem ich die Bäume nicht mehr sehr.

Habt Ihre eine Idee, bzw eine erste Ansatzmöglichkeit. Suchen der Anfangsposition eines Anfangstags /-Endetags. Textrange aus diesem erzeugen, Text ersetzen usw.

Würde mich freuen, wenn sich dieser Threat sich zum "Entwurfsmuster" mausert.
berli2
Beiträge: 3
Registriert: Mi, 22.03.2006 13:10

Beitrag von berli2 »

Nach weiteren zwei Nächten und der Verarbeitung erster Beispiele aus dem SDK 2...

1. Lösung: im Bezug auf einzelne variable Werte benutze ich die Textfield(Benutzerfelder), sie haben gegenüber den Bookmarks den Vorteil, das der Name des Textfields mit den Inhalt "verknüpft" ist. Es ist also möglich das Dokument in diesem Bezug immer aktuell zu halten. (Code später, falls gewünscht)

2. Lösung: Im Bezug auf die Bausteine. Ein Baustein besteht aus einem Kürzel, ein Titel und ein Inhalt. Der Kürzel kann verwendet werden um diesen im Dokument zu positionieren, zu kennzeichen ("Hier bin ich"). Der Titel soll gegenüber dem Inhalt, ein anderes Format aufweisen ("fett" ...). Ein Lösung mit Textfield geht zwar, aber mit einer starken Einschränkung, ich kann lediglich "das Gesamte formatieren". Am besten wäre eine kombiniete Lösung, das Textfield wird lediglich zur Positionierung genutzt. Hinten ran wird ein neuer Paragraph erzeugt, der Titel eingefügt, dieser formatiert und anschließend wird der Inhalt eingefügt. Bei einem erneuten öffnen / füllen des Dokumentes wird das Textfield gesucht, der anschließende Paragraph aktualisiert (gelöscht und neueingefügt). Klingt eigentlich ganz plausibel, nur wie setzte ich diess um :)

Ich tauche mal wieder ab in das SDK...
Stephan
********
Beiträge: 12368
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Beitrag von Stephan »

Sorry, aber mit mir könntest Du Dich höchstens über StarBasic unterhalten, Java kann ich nicht.

Ich sage mal Folgendes:
Was für Dich passt ist ohnehin schwer zu beurteilen, wenn die Variable das da User per Hand nachbearbeiten dazu kommt, weil pauschal unklar ist was die ggf. alles anrichten.

Die Lösung mit den tags im XML ist interessant, kann ich aber konkret nichts sagen außer auf das Spezifikationsdokument zum OpenDocument-Format zu verweisen was auch im SDK ist. Solche Lösung wäre dann aber für mein Verständnis quasi unterhalb der Dokumentenebene, weil Du i.d.S. am 'Quelltext' des Dokuments manipulierst. Geht sicher, aber habe ich keinerlei praktische Erfahrungen, außer gelegendlichem manuellen Eingreifen um defekte Dokumente wieder ans Laufen zu kriegen.

Bei der Textmarken-Geschichte denke auch daran das Du nach dem Einfügen in den Namen der Textmarke vermerken könntest wieviel eingefügt wurde, was aber ziemlich blöd ist wenn hinterher ein User manuell ran geht.

Einzig scheint mir hierfür:
2. Lösung: Im Bezug auf die Bausteine. Ein Baustein besteht aus einem Kürzel, ein Titel und ein Inhalt. Der Kürzel kann verwendet werden um diesen im Dokument zu positionieren, zu kennzeichen ("Hier bin ich"). Der Titel soll gegenüber dem Inhalt, ein anderes Format aufweisen ("fett" ...). Ein Lösung mit Textfield geht zwar, aber mit einer starken Einschränkung, ich kann lediglich "das Gesamte formatieren". Am besten wäre eine kombiniete Lösung, das Textfield wird lediglich zur Positionierung genutzt. Hinten ran wird ein neuer Paragraph erzeugt, der Titel eingefügt, dieser formatiert und anschließend wird der Inhalt eingefügt. Bei einem erneuten öffnen / füllen des Dokumentes wird das Textfield gesucht, der anschließende Paragraph aktualisiert (gelöscht und neueingefügt). Klingt eigentlich ganz plausibel, nur wie setzte ich diess um


die naheligenste Möglichkeit zu sein Textbeeiche zu verwenden, entweder per Code oder auch mit Dokumenten verknüpft und somit automatisch aktualisierend.


Aber nochmals, leider bin ich nicht in der Lage irgendwelchen Java-Code mit Dir zu diskutieren (außer vielleicht Stellen die ich aus 'allgemeiner' Programmierkenntnis zu 'deuten' wüßte)


Gruß
Stephan
berli2
Beiträge: 3
Registriert: Mi, 22.03.2006 13:10

Beitrag von berli2 »

Hallo Stefan, danke für die angebotene "Basic" Unterstützung, ich habe mir gerade ein Ebook zugelegt "OpenOffice - Programmierung", es bassiert auf OO basic, deine angebotene Unterstützung kommt sehr gelegen.

Ob ich nun in JAVA oder in OO Basic ein OO Komponente bearbeiten möchte, beides gemeinsam ist ein Grundverständnis von der OO API, ein Grundverständnis das bei mir anscheint noch nicht aussreicht.

Wie gesagt, deine Hilfe (und auch von andere) ist sehr willkommen :D

Ich konzentriere mich auf die Bausteine, wie gesagt kommen die aus der Anwendung und sie haben die Merkmale Kürzel, Titel und Inhalt. Der/die Baustein(e) soll an einer bestimmten Position im Dokument eingefügt werden, am besten "nicht sicht-/druckbar" im Dokument gekennzeichnet.

Er würden sich Bookmarks anbieten, sind aber zur Zeit in OO "nicht sichtbar" sie können lediglich angesprungen werden und von daher eigentlich ungeeignet.

Dann als Alternative die bereits verwendeten Textfields (Benutzerfelder), nur das diese in dieser Hinsicht lediglich als "Ansprungmarke" verwendet werden. Der Name dieser "Sprungmarke" ist entweder "BAUSTEINE" oder nur bzw zusätzlich das einzelne "KUERZEL" eines Bausteins.

An dieser Stelle soll nun der Baustein eingefügt werden, wobei der Titel andere Zeichenformatierung aufweisen wird (FETT), eine Leerzeile folgt anschließend und zuletzt der Baustein "INHALT". Das ganze am besten noch in einen Absatz, so das ich bei einer erneuten Bearbeitung des Dokumentes entsprechende Absätze aktualisiere oder wenn notwendig entferne.

Irgendiwe habe ich das Gefühl, schon ganz dicht an der Lösung zu sein, aber wie gesagt nur ganz dicht....

Stürze mich wieder in die SDK (jetzt auch in eine einigermaßen übersetzte Version) und in das EBook...
ezuehlke
Beiträge: 4
Registriert: Do, 06.07.2006 21:40

GELÖST !!!

Beitrag von ezuehlke »

Also vorweg, bitte entschuldigt diesen "laienhaften Copy and Paste Code" :) Ich bin noch am lernen und wenn ich etwas mehr Zeit habe, findet ihr die überarbeitet Version meiner Anwendung unter http://www.java-experience.de.


Ok, kommen für zum besagten Code(-Fragment), für erste eigene Ansätze mit Sicherheit sehr hilfreich, so hoffe ich ...

Code: Alles auswählen

package ...[Anwendung].office;

/*
 * notwendige Imports herausgenommen...
 */


public class OpenOffice {
  
  private XComponentContext mxRemoteContext;
  private XMultiComponentFactory mxRemoteServiceManager;
  private String loadUrl;
  private StringBuffer loadUrlSB;
  private String unoUrl = "uno:socket,host=localhost,port=8100;urp;" + 
                          "StarOffice.ServiceManager";

  private XComponent xDocument;
  private XTextDocument xTextDocument;
  
  private XComponentLoader xComponentLoader;
  
  private Dokument dokument;          // Objekt aus der Anwendung
  

  /*  
   *  ========= Kernfunktionen  
   */
  
  public void oeffnen(Dokument dokument){
    this.dokument = dokument;
    ladeDokument(false);

    if (dokument.getTyp() == SGV.BERICHT){
      variablenEinfuegen();
      kapitelListeEinfuegen();
    }  
  }


  public void drucken(Dokument dokument) {
    this.dokument = dokument;
    ladeDokument(true);
    
    if(xDocument != null) {
      
      if (dokument.getTyp() == SGV.BERICHT){
        variablenEinfuegen();
      }
      
      // query the XPrintable interface from your document
       XPrintable xPrintable = (XPrintable)UnoRuntime.queryInterface(XPrintable.class, xDocument);
      // create an empty printOptions array
       PropertyValue[] printOpts = new PropertyValue[0];
//       PropertyValue[] printerDesc = new PropertyValue[1];
//       printerDesc[0] = new PropertyValue();
//       printerDesc[0].Name = "Name";
//       printerDesc[0].Value = "5D PDF Creator";
//       xPrintable.setPrinter(printerDesc);
//       PropertyValue[] printOpts = new PropertyValue[1];
//       printOpts[0] = new PropertyValue();
//       printOpts[0].Name = "Pages";
//       printOpts[0].Value = "1,7";
//       xPrintable.print(printOpts);    
      // kick off printing
       try {
        xPrintable.print(printOpts);
      } catch (IllegalArgumentException e) {
        // TODO Automatisch erstellter Catch-Block
        e.printStackTrace();
      }    
    }
    
  }

  private void ladeDokument(boolean hidden) {
    String datei = dokument.getDatei();
    try {
      
      // den Dateinamen für eine gültige (uno)URL aufbereiten
      java.io.File sourceFile = new java.io.File(datei);
      loadUrlSB = new StringBuffer("file:///");  
      loadUrlSB.append(sourceFile.getCanonicalPath().replace('\\', '/'));
      loadUrl = loadUrlSB.toString();
      
      // remote service manager einrichten
      // und für den XComponentLoader brauchen wir ein Desktop Objekt
      mxRemoteServiceManager = getRemoteServiceManager();
      Object desktop = mxRemoteServiceManager.createInstanceWithContext(
          "com.sun.star.frame.Desktop", mxRemoteContext);
      xComponentLoader = (XComponentLoader)UnoRuntime.queryInterface(
          XComponentLoader.class, desktop);
      
      // Eigenschaften für das Laden (siehe com.sun.star.document.MediaDescriptor )
      PropertyValue[] loadProps = null;
      if (hidden){
        loadProps = new PropertyValue[1];
        loadProps[0] = new PropertyValue();
        loadProps[0].Name = "Hidden";
        loadProps[0].Value = new Boolean(true);       
        
      } else {
        loadProps = new PropertyValue[1];
        loadProps[0] = new PropertyValue();
        loadProps[0].Name = "AsTemplate";
        loadProps[0].Value = new Boolean(false);       
        
      }
      
      //  Laden des Dokumentes
      xDocument = xComponentLoader.loadComponentFromURL(loadUrl, "_blank", 0, loadProps);
      xTextDocument = 
        (XTextDocument)UnoRuntime.queryInterface(XTextDocument.class, xDocument);
      
    } catch (IOException e) {
      // TODO Automatisch erstellter Catch-Block
      e.printStackTrace();
    } catch (Exception e) {
      // TODO Automatisch erstellter Catch-Block
      e.printStackTrace();
    }    
  }

  protected XMultiComponentFactory getRemoteServiceManager() { 
    try {
       // First step: create local component context, get local servicemanager and
       // ask it to create a UnoUrlResolver object with an XUnoUrlResolver interface
        XComponentContext xLocalContext;
          xLocalContext = com.sun.star.comp.helper.Bootstrap.createInitialComponentContext(null);

        XMultiComponentFactory xLocalServiceManager = xLocalContext.getServiceManager();

        Object urlResolver  = xLocalServiceManager.createInstanceWithContext(
            "com.sun.star.bridge.UnoUrlResolver", xLocalContext );
        // query XUnoUrlResolver interface from urlResolver object
        XUnoUrlResolver xUnoUrlResolver = (XUnoUrlResolver) UnoRuntime.queryInterface( 
            XUnoUrlResolver.class, urlResolver );

        // Second step: use xUrlResolver interface to import the remote StarOffice.ServiceManager,
        // retrieve its property DefaultContext and get the remote servicemanager
        Object initialObject = xUnoUrlResolver.resolve( unoUrl );
        XPropertySet xPropertySet = (XPropertySet)UnoRuntime.queryInterface(
            XPropertySet.class, initialObject);
        Object context = xPropertySet.getPropertyValue("DefaultContext");            
        mxRemoteContext = (XComponentContext)UnoRuntime.queryInterface(
            XComponentContext.class, context);
    } catch (Exception e) {
      // TODO Automatisch erstellter Catch-Block
      e.printStackTrace();
    } catch (java.lang.Exception e) {
      // TODO Automatisch erstellter Catch-Block
      e.printStackTrace();
    }
    return mxRemoteContext.getServiceManager();
  }



  /*
   *  ====== einfügen einzelner Stammdatenfelder
   *  
   *  über festgelegte Benutzerfelder im Dokument   
   */
   
  private void variablenEinfuegen(){
    Vorgang vorgang = Vorgang.getInstance();
    Schaden schaden = vorgang.getSchaden();
    Person schadenOrt = schaden.getSchOrt();
    Rechnung rechnung = vorgang.getRechnung();
    Versicherer versicherer = vorgang.getVersicherer();
    Person versicherter = vorgang.getPerson();
    Person versichererAp = vorgang.getVersichererAp();
    Person ast = schaden.getPerson();
    
    feldEinfuegen("VR_BEZEICHNUNG", versicherer.getBezeichnung());
    feldEinfuegen("VR_NAME",       versichererAp.getName());
    feldEinfuegen("VR_VORNAME",    versichererAp.getVorname());
    feldEinfuegen("VR_NACHNAME",   versichererAp.getNachname());
    feldEinfuegen("VR_STRASSE",    versichererAp.getStrasse());

    /*
     * ...
     *
     */
  }

  private void feldEinfuegen (String benutzerfeld, String text){
    try {
      // get XTextFieldsSupplier, XBookmarksSupplier interfaces
      XTextFieldsSupplier xTextFieldsSupplier = (XTextFieldsSupplier)
          UnoRuntime.queryInterface(XTextFieldsSupplier.class,
                                    xDocument);

      // access the TextFields and the TextFieldMasters collections
      XNameAccess xNamedFieldMasters = xTextFieldsSupplier.getTextFieldMasters();
      XEnumerationAccess xEnumeratedFields = xTextFieldsSupplier.getTextFields();

      Object fieldMaster = xNamedFieldMasters.getByName(
          "com.sun.star.text.FieldMaster.User." + benutzerfeld);
      
      
      // query the XPropertySet interface, we need to set the Content property
      XPropertySet xPropertySet = (XPropertySet)UnoRuntime.queryInterface(
          XPropertySet.class, fieldMaster);

      // insert the column value into field master
      xPropertySet.setPropertyValue("Content", text);
      //  afterwards we must refresh the textfields collection
      XRefreshable xRefreshable = (XRefreshable)UnoRuntime.queryInterface(
          XRefreshable.class, xEnumeratedFields);
      xRefreshable.refresh();

    } catch (NoSuchElementException e) {
      // TODO Automatisch erstellter Catch-Block
      // e.printStackTrace();
    } catch (UnknownPropertyException e) {
      // TODO Automatisch erstellter Catch-Block
      // e.printStackTrace();
    } catch (PropertyVetoException e) {
      // TODO Automatisch erstellter Catch-Block
      // e.printStackTrace();
    } catch (IllegalArgumentException e) {
      // TODO Automatisch erstellter Catch-Block
      // e.printStackTrace();
    } catch (WrappedTargetException e) {
      // TODO Automatisch erstellter Catch-Block
      // e.printStackTrace();
    }
  }
   
  
  /*
   *  ====== einfügen der einzelnen Kapitel im definierten Bereich 
   *  
   *  KapitelListe = Objekt Liste aus der Anwendung, mit ...
   *  - Kapitel = Objekt aus der Anwendung, mit ...
   *   - BausteinListe = Objekt Liste aus der Anwendung, mit ...
   *    - Baustein = Bausteintext
   *    
   */
  
  
  private void kapitelListeEinfuegen() {
    /*
     * Position im Dokument ermitteln
     * 1.Fall : noch nicht vorhanden, dann am Ende des Dok. einfügen
     * 2.Fall : Start zwar vorhanden, aber das Ende ist vorloren gegangen
     * 3.Fall : Bereich besteht bereits, dann diesen überschreiben
     *  
     */
    
    XTextRange start = wortSuchen("KSTART");
    XTextRange ende = wortSuchen("KENDE");
    XTextCursor cursor = null;
    XTextRange bereich = null;
    
    String test;
    if (start == null && ende == null){
      XText text = xTextDocument.getText();
      cursor = text.createTextCursor();
      cursor.gotoEnd(false);
      verstecktenTextEinfuegen(cursor,"KSTART");
      cursor.gotoEnd(false);
      kapitelEinfuegen(cursor);
      verstecktenTextEinfuegen(cursor,"KENDE");
    } else {
      if ( ende == null) {
        bereich = start;
        cursor = bereich.getText().createTextCursor();            
        cursor.gotoEnd(true);
        kapitelEinfuegen(cursor);
        verstecktenTextEinfuegen(cursor,"KENDE");
      } else {
        cursor = xTextDocument.getText().createTextCursor();
        test = cursor.getString();        // "" (leer)
        
        cursor.gotoRange(start,false);
        test = cursor.getString();        // "KSTART" (versteckter Text1)
        
        cursor.collapseToEnd();
        test = cursor.getString();        // "" (leer, steht hinter KSTART ?)
        
        cursor.gotoRange(ende,true);
        String test2 = ende.getString();  // "KENDE" (versteckter Text2)
        test = cursor.getString();        // markierter Text bis ans Ende "KENDE"
        
        kapitelEinfuegen(cursor);
      }
    }
  }

  private void kapitelEinfuegen(XTextCursor cursor){
    /*
     * Alle Kapitel mit den jeweiligen Bausteinen einfügen
     * 1. Schritt : Kapitel.Titel (Fett) einsetzen, "versteckt" aufheben
     * 2. Schritt : Kapitel.Baustein.Inhalt (nicht Fett) x mal einsetzen
     * 3. Schritt : nach allen Kapitel, Bereich abschließen
     */
    
    List kapitelListe = dokument.getKapitelListe();
    List bausteinListe = new ArrayList();
    if (kapitelListe.size() > 0){ 
      for (int i = 0; i < kapitelListe.size(); i++) {
        Kapitel kapitel = (Kapitel) kapitelListe.get(i);
        if (kapitel.getDrucken()){
          kapitelEinfuegenTitel(cursor, kapitel.getTitel());
          bausteinListe = kapitel.getBausteine();
          if (bausteinListe.size() > 0){
            for (int j = 0; j < bausteinListe.size(); j++) {
              kapitelEinfuegenBaustein(cursor, (Baustein) bausteinListe.get(j) );
            }
          }
          kapitelEinfuegenBeenden(cursor);
        }
      }
    }
  }

  private XTextRange wortSuchen(String gesucht) {
    /*
     * Ein bestimmtes Wort im Dokument suchen und Position zurückgeben
     */
    
    XInterface result = null;
    XTextRange range = null;
    String string = "";
    try {
      XTextDocument xTextDocument = 
        (XTextDocument)UnoRuntime.queryInterface(XTextDocument.class, xDocument);
      
      XSearchable xSearchable = 
        (com.sun.star.util.XSearchable)
          UnoRuntime.queryInterface(
            com.sun.star.util.XSearchable.class, xTextDocument);

      XSearchDescriptor xSearchDescr = 
        (com.sun.star.util.XSearchDescriptor)
           xSearchable.createSearchDescriptor();

      xSearchDescr.setSearchString(gesucht);
      
      XPropertySet xSearchProp = 
        (com.sun.star.beans.XPropertySet)
           UnoRuntime.queryInterface(
             com.sun.star.beans.XPropertySet.class, xSearchDescr);
      xSearchProp.setPropertyValue("SearchCaseSensitive",new Boolean(true));
      xSearchProp.setPropertyValue("SearchWords",new Boolean(true));
      result = (XInterface) xSearchable.findFirst(xSearchDescr);
      if (result != null){
        range = (XTextRange)UnoRuntime.queryInterface(
            com.sun.star.text.XTextRange.class,result);
      }
      
    } catch( Exception e) {
      e.printStackTrace(System.err);
    }
    return range;
  }
  
  private void verstecktenTextEinfuegen(XTextCursor cursor,String text){
    /*
     * Um bestimme Bereich im Dokument zu kennzeichnen (versteckt durch
     * das Merkmal "ausgeblendet" , über ein Start- und Endewort) 
     */
    
    
    XPropertySet xCursorProps = null;
    try {
      // Text verstecken (ausblenden,hidden) einfuegen
      cursor.gotoEnd(false);
      cursor.setString(text);
      xCursorProps = 
        (XPropertySet) UnoRuntime.queryInterface(XPropertySet.class, cursor );
      xCursorProps.setPropertyValue ( "CharHidden", new Boolean (true) );

      cursor.gotoEnd(false);
      xCursorProps = 
        (XPropertySet) UnoRuntime.queryInterface(XPropertySet.class, cursor );
      xCursorProps.setPropertyValue ( "CharHidden", new Boolean (false) );

    } catch (UnknownPropertyException e) {
    } catch (PropertyVetoException e) {
    } catch (IllegalArgumentException e) {
    } catch (WrappedTargetException e) {
    }
    
  }
  

  /*
   * nachfolgend die Einzelheiten zum einfügen der Kapitelliste
   */
  
  private void kapitelEinfuegenTitel(XTextCursor cursor, String titel) {
    try {
      // cursor.gotoEnd(false);
      String string = cursor.getString();      
      cursor.setString(titel);
      
      // Schriftbild formatieren
      XPropertySet xCursorProps = 
        (XPropertySet) UnoRuntime.queryInterface(XPropertySet.class, cursor );
      xCursorProps.setPropertyValue ( "CharWeight",
                       new Float(com.sun.star.awt.FontWeight.BOLD) );
      xCursorProps = 
        (XPropertySet) UnoRuntime.queryInterface(XPropertySet.class, cursor );
      xCursorProps.setPropertyValue ( "CharHidden", new Boolean (false) );
      
      XText bereich = cursor.getText();
      bereich.insertControlCharacter ( 
          cursor, ControlCharacter.LINE_BREAK, false );
      
    } catch (UnknownPropertyException e) {
    } catch (PropertyVetoException e) {
    } catch (IllegalArgumentException e) {
    } catch (WrappedTargetException e) {
    }
  }

  private void kapitelEinfuegenBaustein(XTextCursor cursor, Baustein baustein) {
    if (baustein.getInhalt().compareTo("") != 0){
      try {
        cursor.gotoEnd(false);
        cursor.setString(baustein.getInhalt());

        // Schriftbild formatieren
        XPropertySet xCursorProps = 
          (XPropertySet) UnoRuntime.queryInterface(XPropertySet.class, cursor );
        xCursorProps.setPropertyValue ( "CharWeight",
                         new Float(com.sun.star.awt.FontWeight.NORMAL) );
        
        XText bereich = cursor.getText();
        bereich.insertControlCharacter ( 
            cursor, ControlCharacter.LINE_BREAK, false );
        
      } catch (UnknownPropertyException e) {
        e.printStackTrace();
      } catch (PropertyVetoException e) {
        e.printStackTrace();
      } catch (IllegalArgumentException e) {
        e.printStackTrace();
      } catch (WrappedTargetException e) {
        e.printStackTrace();
      }
    }
    

  }

  private void kapitelEinfuegenBeenden(XTextCursor cursor){
    cursor.gotoEnd(false);
    
    try {
      XText bereich = cursor.getText();
      bereich.insertControlCharacter ( 
          cursor, ControlCharacter.LINE_BREAK, false );
    } catch (IllegalArgumentException e) {
      // TODO Automatisch erstellter Catch-Block
      e.printStackTrace();
    }
    verstecktenTextEinfuegen(cursor,"KENDE");
    
    
  }


}
So das wars....
ezuehlke
Beiträge: 4
Registriert: Do, 06.07.2006 21:40

auf die Nase gefallen, autsch...

Beitrag von ezuehlke »

Wollte gestern eine erste Version mal -live- testen, gab ein großes "Autsch"...

Ich habe heute den Code nochmal überarbeitet, bevor ich nun die endgültige Version bereitstelle (kann noch etwas dauern) ein kleiner Hinweise:

Ich bin gestolpert über XTextCursor.gotoEnd(), ich war der Meinung, dass ich damit an das Ende der TextRange spinge, dieses ist nicht so. Es repräsentiert ein Sprung an das Ende des Textinhaltes des Dokumentes. XTextCursor.collapseToEnd() ist die richtige Methode!
Antworten