von ezuehlke » So, 09.07.2006 17:28
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....
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 [url]http://www.java-experience.de[/url].
Ok, kommen für zum besagten Code(-Fragment), für erste eigene Ansätze mit Sicherheit sehr hilfreich, so hoffe ich ...
[code]
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");
}
}
[/code]
So das wars....