Scoprirete che su Office non si può solo contare ma anche sviluppare
1
Smart Documents
Luca Regnicoli
MCSD.NET MCSE+I MCDBA MCT
[email protected]
2
Agenda
• Cos’è una soluzione SmartDocument
• Requisiti di una soluzione SmartDocument
• Architettura di SmartDocument
– Assembly e ISmartDocument
– Manifest
– Schema
• Security
• XML & Office System 2003
• Deploy
• Tips & Tricks
3
Cosa diamo per scontato
• Conoscenza di base del .NET Framework
– Interface, Ereditarietà
– Code Access Security
4
Smart Document Basics – Parte I
5
Che cavolo è una soluzione SmartDocument?
• Soluzione che fornisce informazioni
contestuali ed azioni all’interno del task
pane
• Scenari di utilizzo
– Compilazione di un’offerta commerciale
– Generazione di un documento contrattuale
– Gestione di un budget finanziario
6
Requisiti di una soluzione
• PC Client
– Office System 2003 Professional
• oppure versioni stand-alone di Word o Excel
2003
– Se utilizziamo .NET
• .NET Framework 1.1
7
Requisiti di una soluzione
• PC Sviluppo
– Office System 2003 Professional
– Visual Studio .NET 2003
• Oppure un ambiente di sviluppo COM
– Microsoft Office SmartDocument SDK
• Non è fondamentale, ma è un utile
“contenitore” di sample, tool e documentazione
8
Architettura Smart Document
Office document
Manifest file
Schema file
DLL Assembly
Altri assembly
XML expansion pack
9
DLL / Assembly
• Deve contenere una classe che implementi
l’interfaccia COM ISmartDocument
• Può essere scritto con qualsiasi linguaggio
che sia in grado di implementare un
interfaccia COM
– Visual Basic 6.0
– Visual C++ 6.0
– Delphi
– .NET (Interop)
10
Interfaccia ISmartDocument
• Proprietà
–SmartDocXmlTypeCount
–SmartDocXmlTypeCaption
–SmartDocXmlTypeName
–ControlCount
–ControlID
–ControlNameFromID
–ControlCaptionFromID
–ControlTypeFromID
• Metodi
–SmartDocInitialize
–Populate<ControlType>
–On<ControlType>Change
–ImageClick
–InvokeControl
11
ISmartDocument
• Non posso invocare direttamente i metodi o le
proprietà
• Devo “attendere” che il runtime passi il controllo ai
nostri metodi/proprietà
– ControlCount
– PopulateListOrComboContent
• Non pilotiamo direttamente i controlli
– NO textBox1.Text = “Luca”
– NO string s = comboBox1.SelectedItem.Text
• Non possiamo gestire esplicitamente eventi sui
controlli
– NO private void button1_Click (object o, EventArgs e)
12
Terminologia
• Tipi Xml
– Contenitori di controlli
– Definiti nei metodi SmartDocXmlType*
• Controlli Smart Document
– Controlli UI definiti all’interno di tipi XML
– Definiti nei metodi Control*
– Devono avere ID unico all’interno dell’intero
task pane
13
Creare Tipi Xml
• SmartDocXmlCount
–1on
• SmartDocXmlName
– NomeSchema#nomeElementoDelloSchema
– Per creare un task pane persistent
• #actionPertainsToEntireSchema
• SmartDocXmlCaption
– “Esempio di SmartDocument”
14
Creare controlli Smart Document
• ControlCount
–2
• ControlID
– Come associare l’ID al controllo
– Utilizzare ControlIndex passatoci dal runtime
• ControlTypeFromID
– Il controllo con ID = 1 è una textbox
– Il controllo con ID = 2 è un pulsante
15
Controlli Smart Document
•
•
•
•
•
•
•
•
•
•
•
Images
Hyperlinks
Check boxes
List boxes
Combo boxes
Radio buttons
Text boxes
Labels
Separators
ActiveX controls
Document fragments
16
Gestire click
• InvokeControl
switch (ControlID)
{
case 1:
MessageBox.Show (“Pulsante cliccato”); break;
case 2:
....
}
17
Struttura del file Manifest
<manifest xmlns=
"http://schemas.microsoft.com/office
/xmlexpansionpacks/2003">
descrizione del manifest
<solution>
descrizione della solution
</solution>
</manifest>
18
Manifest - Elementi file
<solution>
. . .
<file>
<type>solutionActionHandler</type>
<filePath>bin\Codice.dll</filePath>
<CLSNAME>Libreria.ClasseAzione</CLSNAME>
<managed/>
</file>
</solution>
19
Manifest - Elementi file
<solution>
. . .
<file>
<type>schema</type>
<version>1</version>
<filePath>bin\Schema.xsd</filePath>
</file>
</solution>
20
Schema
<xs:schema xmlns=“Devleap.SmartDocuments.Demo"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
...
<xs:element name="cliente">
<xs:element name="nome" type="xs:string"/>
<xs:element name="cognome" type="xs:string"/>
<xs:element name="email" type="xs:string" />
</xs:element>
...
</xs:schema>
21
Security
• XML expansion pack security
– Manifest può essere caricato solo se è stato
firmato con un certificato digitale
• XMLSign.exe [SDK]
• DisableXMLExpansionPackSecurity.reg
– Solo sulle macchine di sviluppo!
• Se utilizziamo .NET
– Office si “fida” di mscoree.dll
– Ma non si “fida” del nostro assembly
– L’assembly deve avere permission di FullTrust
22
Collegare Manifest al documento
• In Word 2003
– Menu “Tools” - “Templates and Add-ins”
• In Excel 2003
– Menu “Data“ - ”XML” - “XML Expansion Packs”
23
Sviluppo .NET
• Utilizzare i Primary Interop Assembly per
Office
• Microsoft.Office.Interop.SmartTag.dll
– ISmartDocument
• Microsoft.Office.Interop.Excel
• Microsoft.Office.Interop.Word
• Per aggiornamenti di Service Pack di
Microsoft
24
Primary Interop Assembly
• Come vedere se sono installati
– Global Assembly Cache
25
Primary Interop Assembly
• Come installare
Microsoft.Office.Interop.SmartTag.dll
26
Primary Interop Assembly
• Come installare
Microsoft.Office.Interop.Word.dll
27
Primary Interop Assembly
• Come vedere se li stiamo referenziando
correttamente da Visual Studio .NET
28
Ricapitolando... Step By Step
•
•
•
•
•
•
•
•
•
Aggiungere la reference COM a “Microsoft Smart Tag 2.0 Type Lib“
Implementare l’interfaccia ISmartDocument
Definire il namespace di base
Definire il tipo XML del doc #actionPertainsToEntireSchema”
Implementare le proprietà dell’interfaccia ISmartDocument
– Caption dei controlli
– Numero di controlli
– Id dei controlli
– Tipo di controlli
– Nome dei controlli
– Controllare le azioni dei controlli quali button
– Impostare la caption del task pane
– Numero di tipi xml del task pane
– Nome dei tipi xml del task pane
Creare lo schema xml
Creare il manifest
Configurare la Code Access Security
– L’assembly deve avere diritto di FullTrust
Aggiungere l’xml expansion pack al documento
29
Demo … finalmente del codice 
30
Smart Document Basics – Parte II
31
Formattazione di controlli
• Nei metodi Populate* utilizzare la variabile
di tipo ISmartDocProperties per “scrivere” il
valore delle proprietà di formattazione
Props.Write (“Align”, “Center”);
• Per l’elenco delle proprietà disponibile
vedere la documentazione
– Reference -> ISmartDocProperties ->
Interfaces -> ISmartDocProperties Interface
32
Textbox1.Text... Dov’è?
private string valoreTextbox = String.Empty;
public void OnTextboxContentChange(…, string Value)
{
valoreTextbox = Value;
}
public void InvokeControl( …)
{
MessageBox.Show (“Il valore è: “ + valoreTextbox );
}
33
ComboBox
private string valoreSelezionatoCombo = String.Empty;
public void PopulateListOrComboContent(…, ref Array List, ref int Count, ref int
InitialSelected)
{
string[] elementi = new string[3] {“Pulp Fiction”, “Matrix”, “Giovannona coscialunga”};
List = elementi;
Count = 3;
}
//InitialSelected = -1; //InitialSelected = 2
public void OnListOrComboSelectChange(…, int Selected, string Value)
{
valoreSelezionatoCombo = Value;
}
public void InvokeControl( …)
{
}
MessageBox.Show (“Il selezionato è: “ + valoreSelezionatoCombo );
34
Integrazione con Word
private _Document objWord;
public void SmartDocInitialize(.. , object Document, ...)
{
objWord = (_Document)Document;
}
public void InvokeControl(...)
{
objWord.Application.Selection.TypeText ("Ho scritto sul
documento");
}
35
Integrazione con Excel
private _Workbook objExcel;
public void SmartDocInitialize(.. , object Document, ...)
{
objExcel = (_Workbook)Document;
}
public void InvokeControl(...)
{
_Worksheet objSheet = (_Worksheet)objExcel.ActiveSheet;
Range objRange = objSheet.get_Range("A1", Type.Missing);
objRange.set_Value(Type.Missing, "Ho scritto nella cella");
}
36
RefreshPane
• Metodo RefreshPane permette di eseguire
un refresh dell’intero task pane
– Che fantasia eh!
• Tutti i metodi e proprietà verranno
richiamati
• Alcuni utilizzi
– Per rendere visibili/invisibili dei controlli
– Per caricare immagini diverse
• Scenario ComboBox, Immagine legata alla
combo
37
XML e Office 2003
• Utilizzare un modello di programmazione
xml-oriented al posto di vba-oriented
– Il documento espone nodi xml
– Posso individuarli, leggerli ed impostarli
• Word 2003
– SelectSingleNode
– SelectNodes
• Excel 2003
– XmlMapQuery
38
Dynamic Task Pane
• Capacità di caricare sezioni del task pane
diverse in funzione della posizione del
cursore sul documento
• Basato sugli elementi dello schema e sul
relativo mapping all’interno documento
39
Dynamic Task Pane - Step 1
• Creare lo schema con diversi elements
<?xml version="1.0" encoding="utf-8" ?>
<xs:schema xmlns="Devleap.SmartDocuments.Demo” >
<xs:element name="demo">
<xs:element name="cliente">
<xs:element name="nome" type="xs:string" />
<xs:element name="cognome" type="xs:string" />
</xs:element>
</xs:element>
</xs:schema>
40
Dynamic Task Pane - Step 2
• Mappare gli elementi dello schema sul
documento
41
Dynamic Task Pane - Step 3
• Modificare il codice aggiungendo i tipi xml
– SchemaNamespace#ElementName
– Devleap.SmartDocuments.Demo#cliente
• Modificare il codice aggiungendo la
discriminante dei tipi xml
– ControlCount
switch (XMLTypeName)
case DOC_MAIN
return 2
case DOC_CLIENTE
return 3
42
Smart Document “tips and tricks”
43
Windows Forms
• Windows Forms e Task Pane ??
• Certo sono classi!
– Basta aggiungere una Forms al progetto
• Supporto del designer di Visual Studio .NET
– Instanziare la classe e lanciare il metodo Show
44
Word e Excel
• Word, aggiungendo l’xml expansion pack
– Legge il manifest e recupera le informazioni
legate all’assembly e allo schema
• Excel, aggiungendo l’xml expansion pack
– Legge il manifest e recupera le informazioni
legate all’assembly
– Dobbiamo andare nel menu XML Source per
aggiungere lo schema
• Altrimenti il task pane verrà caricato senza
errori ma risulterà vuoto!
45
Excel
• Elementi di uno schema, di default, per
Excel sono associabili ad UNA SOLA cella
• Soluzione
– maxOccurs=“unbounded”
• XmlDataQuery vs XmlMapQuery
• “Invalid format or old type library”
– Regional settings della macchina sono in una
lingua diversa dall’installazione di Office
• Regional settings in ITA e Office 2003 in ENG
46
Interface
• Word
– _Document o Document
• Funzionalità analoghe ma solo con Document è
possibile intercettare gli eventi del documento
(BeforeDocumentClose ecc.)
• Excel
– _Workbook o Workbook
• Funzionalità analoghe ma solo con Workbook è
possibile intercettare gli eventi del documento
(AfterDocumentSave ecc.)
47
ActiveX
• Creare il controllo con C_TYPE_ACTIVEX
– E fin qui...
• Nel metodo PopulateActiveXProps impostare
– Width ed Height
• Il default è 0 per entrambe!
• Nel ControlCaptionFromId impostare
– Il GUID nella caption del controllo!!!!
• Vi SCONSIGLIO di utilizzarli
– Kg , Kg e kg di bug
48
Debugging da VS.NET
• Nota! Prima dobbiamo “attaccare”
correttamente il manifest
49
Tabelle di Word
• Associando un elemento dello schema ad
una cella di una tabella di Word
• Quando si creerà una nuova riga, l’elemento
verrà ricopiato da Word automaticamente
• Si utilizza il modello vba-oriented
– Per creare la nuova riga
• Si utilizza il modello xml-oriented
– Per leggere la collezione di XMLNodes
contenuta nella tabella
– XMLNodes nodi = SelectNodes(“.../Prezzo”,
...);
50
Deploy Smart Documents
51
Certificato
• Va bene qualsiasi certificato di code-signing
rilasciato da certification authority riconosciute
• La più utilizzata è Verisign
– Microsoft Authenticode Digital ID
• Firma del manifest
– Installa il certificato (.cer) sulla macchina di sviluppo
– Si estrae la chiave privata del certificato
• pvkimprt.exe (sito microsoft.com)
• Se errore di password errata riprovare su Windows
2000
– Si installa la chiave privata
– Lanciare XMLSign.exe e firmare il manifest con il
certificato appena installato
52
caspol.exe
• Tool da riga di comando per modificare la
Code Access Security di .NET
caspol.exe -pp off -ag 1.1 -url
"file://C:/InstallDir/*" FullTrust -n
PolicyDevleap
53
InstallManifest
• Excel
Excel.Application objExcel = new Excel.ApplicationClass();
string pathDocumento = @"c:\installDir\demo.xls";
string pathManifest = @"c:\installDir\manifest.xml";
string pathSchema = @"c:\installDir\schema.xsd";
objWorks = objExcel.Workbooks;
objWork = objWorks.Open(pathDocumento,…);
objWork.XmlNamespaces.InstallManifest(pathManifest …);
objWork.XmlMaps.Add(pathSchema ….);
54
Legame Documento - Manifest
• L’associazione fra il documento ed il manifest viene
mantenuta all’interno delle Custom Property del
documento stesso
– SolutionID e SolutionURL
• Possiamo automatizzare da codice questo processo
Object objProp ;
objProp = objWork.CustomDocumentProperties;
Type typeDocCustomProps = objProp.GetType();
object[] objArgsSolutionId = {"Solution ID", … , "DemoCS.Codebehind"};
typeDocCustomProps.InvokeMember("Add", … , objProp, objArgsSolutionId
);
object[] objArgsSolutionUrl = {"Solution URL", …, pathManifest};
typeDocCustomProps.InvokeMember("Add", … , objProp,
objArgsSolutionUrl );
55
Cartella dei Template
• Copiando un .dot o .xlt nella cartella
predefinita di Office 2003
– Verrà aggiunto ai template disponibili
• New Office Document
• Word o Excel
– New Document -> Templates -> On my computer
• Se si crea una sotto-cartella rispetto alla
directory dei template
– Verrà aggiunto un nuovo tab alla dialog box dei
template disponibili
56
Primary Interop Assembly
• I componenti per .NET se sono installati dopo il
framework hanno l’icona “1” ovvero “Installed on
first use”
– Al primo utilizzo dell’applicazione smartdoc gli verrà
chiesto il cd di setup all’utente
– Oppure silent se ha scelto di mantenere i file di
installazione
• Altrimenti hanno la “X” ovvero “Not Installed”
• E’ sufficiente ri-lanciare (anche in automatico) il
setup di Office System 2003 alla fine del nostro setup
– L’utente dovrà solo fare “Next”
– A questo punto il FW .NET sarà già installato e i
componenti avranno l’icona su “Installed on first use”
57
Step setup - 1
• Installare il .net framework 1.1
• Copiare nella cartella d’installazione il
manifest (firmato con XMLSign.exe), lo
schema e l’assembly
• Copiare nella cartella dei template di office
(o dove vogliamo) il .xlt/.xls o il .dot/.doc
• Lanciare un .exe che associ il manifest al .xlt
e al .dot
58
Step setup - 2
• Lanciare un programma o batch che
modifichi la sicurezza .net, per questo
abbiamo 3 scelte:
– 1) Lanciare un volgarissimo .bat con
caspol.exe
– 2) Lanciare un vbs che grazie agli oggetti
WScript.Shell lanci caspol.exe
– 3) Lanciare un .exe .net che grazie alle classi
del fw cambi i parametri di sicurezza
• Lanciare il setup di Office 2003
– Primary Interop Assembly
59
Scoprirete che su Office non si può solo contare ma anche sviluppare
60
Scarica

Controlli Smart Document