WriterContextMenu

From OpenOffice.org Wiki

Jump to: navigation, search

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! :-)

Personal tools