WriterContextMenu
From OpenOffice.org Wiki
Lanzemos una ventana mas grande en vez de una ventanita de informacion InfoBox. Asi que queremos dar clic en la grafica en Writer y tener la opcion de guardar la grafica o imagen directamente al disco!
Genial! Asi que lo que debemos comenzar es definir un identificador el cual usaremos y lo meteremos donde todos los otros identificadores estan ubicados:
--- sw/inc/cmdid.h 2004-12-07 18:57:10.000000000 +0530 +++ sw/inc/cmdid.h 2004-12-21 19:08:39.000000000 +0530 @@ -159,6 +159,7 @@ Achtung: Ab sofort sind in diesem File k #define FN_GET_DOCSTAT (FN_FILE + 33) /* Dokumentstatistik einzeln auslesen */ +#define FN_SAVE_GRAPHIC (FN_FILE + 34) /* Save embedded graphic as */ #define FN_SAVE_SELECTION (FN_FILE + 35) /* Selektion speichern */
Asi que eso sera nuestro identificador, lo siguiente es calificar nuestro identificador para el metodo de llamar cuando esta invocado, a cualquier canal:
--- sw/sdi/_grfsh.sdi 2004-10-15 16:13:21.000000000 +0530
+++ sw/sdi/_grfsh.sdi 2004-12-21 20:15:52.000000000 +0530
@@ -85,6 +85,13 @@ interface BaseTextGraphic : Selection
DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
]
+ FN_SAVE_GRAPHIC
+ [
+ ExecMethod = Execute ;
+ StateMethod = NoState ;
+ DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
+ ]
+
SID_INSERT_GRAPHIC // zeigt auf FN_FORMAT_GRAFIC_DLG
[
ExecMethod = Execute ;
Tambien hay muchos atributos que necesitan ser definidos a cualquier slot que sea usado para mantener el elemento del menu o de la barra de herramienta y estos atributos sond efinidos como elementos ...Sfx:
--- sw/sdi/swriter.sdi 2004-11-29 14:28:57.000000000 +0530 +++ sw/sdi/swriter.sdi 2004-12-21 19:13:45.000000000 +0530 @@ -3466,6 +3466,31 @@ SfxVoidItem GraphicDialog FN_FORMAT_GRAF ] //-------------------------------------------------------------------------- +SfxVoidItem SaveGraphic FN_SAVE_GRAPHIC +() +[ + /* flags: */ + AutoUpdate = FALSE, + Cachable = Cachable, + FastCall = FALSE, + HasCoreId = FALSE, + HasDialog = TRUE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerItem; + Asynchron; + + /* config: */ + AccelConfig = TRUE, + MenuConfig = TRUE, + StatusBarConfig = FALSE, + ToolBoxConfig = TRUE, + GroupId = GID_GRAPHIC; +] + +//-------------------------------------------------------------------------- SfxVoidItem Grow FN_GROW_FONT_SIZE () [
Con esto,estamos listo para usar nuestro nuevo elemento como sfx y lo usaremos agregandolo dentro del menu de popup que esta especificado como MN_GRF_POPUPMENU dentro de mn.src:
--- sw/source/ui/app/mn.src 2004-11-29 14:29:10.000000000 +0530
+++ sw/source/ui/app/mn.src 2004-12-21 20:28:27.000000000 +0530
@@ -945,6 +945,13 @@ Menu MN_GRF_POPUPMENU
SEPARATOR ;
MenuItem
{
+ Identifier = FN_SAVE_GRAPHIC ;
+ HelpID = FN_SAVE_GRAPHIC ;
+ Text [ de ] = "~Grafik speichern..." ;
+ Text [ en-US ] = "Save ~Graphic..." ;
+ };
+ MenuItem
+ {
Identifier = FN_FORMAT_GRAFIC_DLG ;
HelpID = FN_FORMAT_GRAFIC_DLG ;
Text [ de ] = "~Grafik..." ;
Esto agregao dentro del elemento que el menu y que aun necesitamos definir que pasa cuando esta dado clic como hemos especificado en nuestro handler que invocan el metodo Execute, asi que necesitmos llenar el handler para este item dentro de ese metodo:
--- sw/source/ui/shells/grfsh.cxx 2004-12-07 18:57:35.000000000 +0530
+++ sw/source/ui/shells/grfsh.cxx 2004-12-21 22:19:53.684296352 +0530
@@ -217,6 +227,11 @@ void SwGrfShell::Execute(SfxRequest &rRe
USHORT nSlot = rReq.GetSlot();
switch(nSlot)
{
+ case FN_SAVE_GRAPHIC:
+ SaveGraphic();
+ rReq.Ignore();
+ break;
+
case SID_INSERT_GRAPHIC:
case FN_FORMAT_GRAFIC_DLG:
{
Asi que definimos un llamado del llamado SaveGraphic que sera invocado donde este elemento esta dando clic, y despues definirlo en el metodo:
--- sw/source/ui/shells/grfsh.cxx 2004-12-07 18:57:35.000000000 +0530
+++ sw/source/ui/shells/grfsh.cxx 2004-12-21 22:19:53.684296352 +0530
@@ -739,6 +754,20 @@ void SwGrfShell::GetAttrState(SfxItemSet
}
+
+
+void SwGrfShell::SaveGraphic()
+{
+ using namespace ::sfx2;
+ using namespace com::sun::star::ui::dialogs;
+ using namespace ::com::sun::star::uno;
+
+ FileDialogHelper aDlgHelper( TemplateDescription::FILESAVE_SIMPLE, 0 );
+ Reference < XFilePicker > xFP = aDlgHelper.GetFilePicker();
+ aDlgHelper.Execute();
+
+ InfoBox( NULL, xFP->getFiles()[0] ).Execute();
+}
+
+
SwGrfShell::SwGrfShell(SwView &rView) :
SwBaseShell(rView)
Puedes predecir la funcion que hace ? :-) Como prometido, lanza la caja de dialogo que es deinitivamente mas grande que una InfoBox y darle seguimiento de cualquier forma con InfoBox :-D
Para todos estos objetos que hemos usado, necesitamos declarlos tambien:
--- sw/source/ui/shells/grfsh.cxx 2004-12-07 18:57:35.000000000 +0530 +++ sw/source/ui/shells/grfsh.cxx 2004-12-21 22:19:53.684296352 +0530 @@ -137,6 +137,16 @@ + #include <svx/tbxcolor.hxx> + #endif + +#ifndef _COM_SUN_STAR_UI_DIALOGS_XFILEPICKER_HPP_ +#include <com/sun/star/ui/dialogs/XFilePicker.hpp> +#endif +#ifndef _COM_SUN_STAR_UI_DIALOGS_TEMPLATEDESCRIPTION_HPP_ +#include <com/sun/star/ui/dialogs/TemplateDescription.hpp> +#endif +#ifndef _FILEDLGHELPER_HXX +#include <sfx2/filedlghelper.hxx> +#endif + #ifndef _FMTURL_HXX //autogen #include <fmturl.hxx> #endif
Tambien debemos declarar el nuevo metodo que hemos agregado a la clase dentro de la definicion de clases:
--- sw/source/ui/inc/grfsh.hxx 2000-10-05 17:04:19.000000000 +0530
+++ sw/source/ui/inc/grfsh.hxx 2004-12-21 19:24:14.000000000 +0530
@@ -71,6 +71,7 @@ public:
void Execute(SfxRequest &);
void ExecAttr(SfxRequest &);
void GetAttrState(SfxItemSet &);
+ void SaveGraphic();
SwGrfShell(SwView &rView);
};
Y asi queda, el grandioso port de sd-guardar-imagen-menu-contexto como lo planeamos para aplicar a Writer. Aun asi necesitamos extraer las graficas seleccionadas desde Writer y lo guardamos al disco. Si esto esta hecho, el patch sera completo :-)
Quien se atreve ? :-)
Pero depues de entender este procedimiento, podemos entender otras maneras similares de hacerlo, hackeea dentro de Impress te pemrite la misma capacidad, con la diferenceia que esta completo! :-)

