Progetto

Generale

Profilo

MonoMiniBrowser » Cronologia » Versione 7

Simone Piccardi, 24-12-2010 12:47

1 6 Amministratore Truelite
h1. Come costruire un semplice browser con Monodevelop e Glade.
2
3
4 1 Amministratore Truelite
Utilizzando gli strumenti che Mono mette a disposizione, è molto semplice creare un semplice browser ed è un ottimo esercizio per imparare a conoscerli. Monodevelop è un IDE (Integrated development Environment) basato su Mono e Gtk#. Glade-2 è un editor visuale di interfacce grafiche Gtk+/Gnome che salva il layout di queste in dei file XML. Utilizzando libglade, il programmatore può includere questi file nella sua applicazione, senza dover perdere tempo scrivendo “a mano” l'interfaccia grafica.
5 4 Amministratore Truelite
6 1 Amministratore Truelite
7 6 Amministratore Truelite
h2. Si inizia: Monodevelop
8 1 Amministratore Truelite
9 6 Amministratore Truelite
10 1 Amministratore Truelite
Dopo aver lanciato Monodevelop, si selezioni _File -> New Solution_. Comparirà una finestra che offrirà diverse scelte per quanto riguarda i template ed i tipi di progetto. Si scelga _C#_ come template e _Glade#_ come tipo di progetto. Questo creerà del codice di base: un piccolo programma che visualizza una finestra quando viene lanciato.
11 6 Amministratore Truelite
12 7 Simone Piccardi
!minibrowser1.png!
13 2 Amministratore Truelite
14 6 Amministratore Truelite
Monodevelop usa la stessa terminologia di "VisualStudio.NET" per la definizione dei progetti: una “soluzione” (chiamata _solution_) contiene diversi progetti (_projects_); in tal modo viene favorita la migrazione di un programmatore abituato a tale strumento, che ritroverà le convenzioni a cui è abituato.
15 1 Amministratore Truelite
16 2 Amministratore Truelite
C'è un ulteriore passo da eseguire prima di iniziare con il programma vero e proprio: aggiungere “gecko-sharp” alla lista di referenze che si useranno in Monodevelop. In tal modo si avrà l'autocompletamento del codice anche per le classi appartenenti a gecko-sharp. Per farlo è sufficiente eseguire un click destro sul menu “references” e selezionare la voce “edit-references” e successivamente spuntare la voce “gecko-sharp” nel menu che viene presentato.
17
18 7 Simone Piccardi
!minibrowser2.png!
19 1 Amministratore Truelite
20
A questo punto si può partire!
21 2 Amministratore Truelite
22
23 6 Amministratore Truelite
h2. Costruire l'interfaccia grafica
24
25
26 2 Amministratore Truelite
L'interfaccia grafica verrà creata utilizzando glade. Monodevelop avrà gia creato un file XML di base contenente i dati per visualizzare una finestra vuota.
27
28 1 Amministratore Truelite
Tale file sarà disponibile tra i “Resource File” (sopra alle “References” nel menu del progetto di Monodevelop). Un doppio click sul file lancerà glade che ci mostrerà appunto la finestra vuota di default.
29 2 Amministratore Truelite
30
Una volta avviato glade, possiamo modificare ad esempio l'oggetto “window1” cambiandone il titolo in, ad esempio, “Mini Gecko-Browser”.
31 1 Amministratore Truelite
32 7 Simone Piccardi
!minibrowser3.png!
33 2 Amministratore Truelite
34
A questo punto si può iniziare a creare il layout della finestra, dividendola “strisce” inizialmente verticali (vertical box). In questo caso ne vanno create 4: una per il menu, una per la barra di navigazione, una per la finestra di rendering del browser ed una per la barra di stato.
35
36 7 Simone Piccardi
!minibrowser4.png!
37 2 Amministratore Truelite
38
Ora è il momento di aggiungere i vari componenti dell'interfaccia grafica, ad iniziare dal menu. Si selezioni “barra dei menu” tra i componenti messi a disposizione da glade e lo si assegni al “box” che sta più in alto. Visto che nel programma useremo dei nomi diversi per i gestori degli eventi generati dal menu, dobbiamo avere la cura di modificare il menu eliminando il campo “Gestore” da ogni elemento di questo.
39
40
Dopo aver aggiunto il menu, selezioniamo il componente “horizontal box”, ed in maniera analoga a come si sono create le “strisce” orizzontali, dividiamo in 7 segmenti la seconda a partire dall'alto, attigua a quella appena modificata.
41
42
A questo punto aggiungiamo un bottone per i primi 5 segmenti, una “TextArea” nel sesto ed un altro bottone nel settimo. Ora andremo a modificare i bottoni, assegnandogli quelli “stock” di gnome, in modo che abbiano sempre lo stesso significato ed un aspetto simile indipendentemente dal tema grafico in uso. Per farlo ci basta clickare sul bottone interessato, e selezionare dal menu a tendina “Pulsante Stock”. Nell'ordine assegneremo: Indietro, Avanti, Aggiorna, Ferma, Home, Vai A.
43 1 Amministratore Truelite
44 2 Amministratore Truelite
Dopo avere eseguito questa operazione, dobbiamo dire al widget che “contiene” i bottoni di occupare in altezza solo lo spazio necessario: dopo un click sinistro su uno dei bottoni, selezioniamo “hbox1”, spostiamoci sul pannello delle proprietà, settiamo a “No” la proprietà “Espandi” e “Riempi”.
45
46
A questo punto la nostra finestra dovrebbe avere un aspetto simile.
47 3 Amministratore Truelite
48 2 Amministratore Truelite
49 7 Simone Piccardi
!Image(minibrowser5.png!
50 2 Amministratore Truelite
51 1 Amministratore Truelite
Per il sottostante, selezioniamo ed applichiamo un componente “frame” (in italiano cornice). Dopo averlo aggiunto, selezioniamo la sua “label” (etichetta) e cancelliamola, di modo che sia vuota e non etichettata. In seguito la riempiremo con il “rendering widget” di Gecko che non è disponibile in glade.
52 2 Amministratore Truelite
53 1 Amministratore Truelite
È possibile salvare il nostro lavoro e chiudere glade, per iniziare a programmare.
54 2 Amministratore Truelite
55 1 Amministratore Truelite
Iniziamo con l'aggiungere il namespace Gecko al nostro progetto:
56 7 Simone Piccardi
57 1 Amministratore Truelite
<pre>
58 6 Amministratore Truelite
using Gecko;
59 1 Amministratore Truelite
60 2 Amministratore Truelite
public class [[GladeApp]]
61 1 Amministratore Truelite
{
62 6 Amministratore Truelite
...
63 2 Amministratore Truelite
</pre>
64 7 Simone Piccardi
65 6 Amministratore Truelite
Glade permette di collegare i controlli dell'interfaccia grafica alle referenze nel programma, a patto che siano indicate come Glade.Widget. Aggiungiamo quindi il codice per mettere glade a conoscenza dei widget che vogliamo utilizzare nel nostro programma.
66 2 Amministratore Truelite
67
Siccome glade ci permette di conttrollare solo i widget standard, dichiareremo una variabile chiamata “moz” per avere a disposizione il controller del browser.
68 7 Simone Piccardi
69 6 Amministratore Truelite
<pre>
70
public class [[GladeApp]]
71 2 Amministratore Truelite
{
72 1 Amministratore Truelite
	[Widget] Alignment alignment1;
73 6 Amministratore Truelite
	[Widget] [[MenuBar]] menubar1;
74 1 Amministratore Truelite
	[Widget] Statusbar statusbar1;
75 2 Amministratore Truelite
	[Widget] Button button1;
76
	[Widget] Button button2;
77 1 Amministratore Truelite
	[Widget] Button button3;
78 2 Amministratore Truelite
	[Widget] Button button4;
79 1 Amministratore Truelite
	[Widget] Button button5;
80 2 Amministratore Truelite
	[Widget] Button button6;
81
	[Widget] Entry entry1;
82
	// non gestibile direttamente da glade
83
	WebControl moz;
84 1 Amministratore Truelite
	...
85 2 Amministratore Truelite
</pre>
86 7 Simone Piccardi
87 6 Amministratore Truelite
Ora che abbiamo una variabile a cui farlo puntare, possiamo creare il [[WebControl]] ed “attaccarlo” all'interfaccia grafica.
88 1 Amministratore Truelite
89 6 Amministratore Truelite
<pre>
90 2 Amministratore Truelite
Glade.XML gxml = new Glade.XML (null, "gui.glade", "window1", null);
91 1 Amministratore Truelite
                gxml.Autoconnect (this);
92 2 Amministratore Truelite
                // Creiamo un webcontrol usando il costruttore di default
93 6 Amministratore Truelite
                moz = new [[WebControl]]();
94 1 Amministratore Truelite
                // A causa di un bug di Gecko dobbiamo dirgli esplicitamente
95
                // di visualizzarsi
96 2 Amministratore Truelite
                moz.Show();
97 1 Amministratore Truelite
                // Ora lo agganciamo alla gui
98 2 Amministratore Truelite
                alignment1.Add(moz);
99 1 Amministratore Truelite
		    ...
100 2 Amministratore Truelite
</pre>
101 7 Simone Piccardi
102 2 Amministratore Truelite
Le cose ora si fanno più interessanti, perchè possiamo iniziare a delegare dei metodi agli eventi che occorrono ai vari widget che abbiamo creato. Se scriviamo “entry1” noteremo che comprarirà un menu che ci suggerirà tutti i possibili compleamenti di quel frammento di codice; selezioniamo “Activated”.
103 6 Amministratore Truelite
Siccome C# supporta l'overloading degli operatori, possiamo letteralmente aggiungere “load_url” alla lista dei “delegate” attivati all'occorrenza di “entry1.Activated”.
104 7 Simone Piccardi
105 2 Amministratore Truelite
<pre>
106 6 Amministratore Truelite
entry1.Activated += load_url;
107 2 Amministratore Truelite
</pre>
108 7 Simone Piccardi
109 1 Amministratore Truelite
Bisogna quindi implementare il metodo “load_url”, cosa che faremo nel seguente modo:
110 2 Amministratore Truelite
111 6 Amministratore Truelite
<pre>
112
// passiamo il testo di entry1 come parametro a [[LoadUrl]] di gecko. 
113 2 Amministratore Truelite
// In tal modo verrà caricato l'indirizzo selezionato.
114
115 6 Amministratore Truelite
void load_url (object source, [[EventArgs]] args)
116 2 Amministratore Truelite
        {
117
        	moz.LoadUrl(entry1.Text);
118
        }
119 6 Amministratore Truelite
</pre>
120 2 Amministratore Truelite
121
Avendo chiari in mente questi concetti, si può passare all'implementazione degli altri metodi delegati, procedendo in maniera simile a quanto appena fatto:
122
123 6 Amministratore Truelite
<pre>
124 2 Amministratore Truelite
//inseriamo la gestione degli eventi
125
entry1.Activated += loadUrl;
126 1 Amministratore Truelite
button1.Clicked += goBack;
127 2 Amministratore Truelite
button2.Clicked += goForward;
128
button3.Clicked += doReload;
129 1 Amministratore Truelite
button4.Clicked += doStop;
130 2 Amministratore Truelite
button5.Clicked += goHome;
131
button6.Clicked += goTo;
132
quit1.Activated += doQuit;
133
</pre>
134 6 Amministratore Truelite
135 2 Amministratore Truelite
Implementazione dei vari metodi:
136 7 Simone Piccardi
137 6 Amministratore Truelite
<pre>
138 2 Amministratore Truelite
// Carica l'url selezionato
139 6 Amministratore Truelite
        void loadUrl (object source, [[EventArgs]] args)
140 1 Amministratore Truelite
        {
141 2 Amministratore Truelite
        	moz.LoadUrl(entry1.Text);
142
        	// Scriviamo nella status-bar la locazione corrente.
143
        	statusbar1.Push(1, moz.Location);
144
        }
145
        
146 1 Amministratore Truelite
        // Va indietro nella cronologia
147 6 Amministratore Truelite
        void goBack (object source, [[EventArgs]] args)
148 2 Amministratore Truelite
        {
149
        	if (moz.CanGoBack())
150
        		moz.GoBack();
151
        	statusbar1.Push(1, moz.Location);
152
        }
153 1 Amministratore Truelite
        
154 2 Amministratore Truelite
        // Va avanti nella cronologia
155 6 Amministratore Truelite
        void goForward (object source, [[EventArgs]] args)
156 2 Amministratore Truelite
        {
157
        	if (moz.CanGoForward())
158
        		moz.GoForward();
159 1 Amministratore Truelite
        	statusbar1.Push(1, moz.Location);
160 2 Amministratore Truelite
        }
161 1 Amministratore Truelite
        
162
        // Ricarica la pagina corrente
163 6 Amministratore Truelite
        void doReload (object source, [[EventArgs]] args)
164 1 Amministratore Truelite
        {
165 2 Amministratore Truelite
        	moz.Reload(1);
166
        	statusbar1.Push(1, moz.Location);
167
        }
168
        
169
        // Ferma il caricamento della pagina
170 6 Amministratore Truelite
        void doStop (object source, [[EventArgs]] args)
171 2 Amministratore Truelite
        {
172
        	moz.StopLoad();
173
        	statusbar1.Push(1, "Apertura della pagina annullata");
174
        }
175
        
176
        // Carica la homepage
177 6 Amministratore Truelite
        void goHome (object source, [[EventArgs]] args)
178 2 Amministratore Truelite
        {
179
        	moz.LoadUrl("http://www.truelite.it/");
180
        	statusbar1.Push(1, moz.Location);
181
        	entry1.Text = moz.Location;
182
        }
183
        
184
        // Va alla locazione presente nella Entry
185 6 Amministratore Truelite
        void goTo (object source, [[EventArgs]] args)
186 2 Amministratore Truelite
        {
187
        	moz.LoadUrl(entry1.Text);
188
        	statusbar1.Push(1, moz.Location);
189
        }
190 6 Amministratore Truelite
        
191 1 Amministratore Truelite
        // termina l'applicazione
192 2 Amministratore Truelite
        void doQuit (object source, [[EventArgs]] args)
193
        {
194
        	Application.Quit ();
195 6 Amministratore Truelite
        }
196
</pre>
197
198
h2. Prodotto finito!!!
199 2 Amministratore Truelite
200 7 Simone Piccardi
!Image(minibrowser6.png!