[Libreoffice-commits] core.git: sc/inc sc/source sc/uiconfig sc/UIConfig_scalc.mk
Caolán McNamara
caolanm at redhat.com
Tue Jun 11 05:37:42 PDT 2013
sc/UIConfig_scalc.mk | 3
sc/inc/sc.hrc | 5 -
sc/inc/scabstdlg.hxx | 5 -
sc/source/ui/attrdlg/scdlgfact.cxx | 28 ------
sc/source/ui/attrdlg/scdlgfact.hxx | 5 -
sc/source/ui/inc/groupdlg.hxx | 9 -
sc/source/ui/miscdlgs/groupdlg.cxx | 17 +--
sc/source/ui/src/miscdlgs.src | 66 --------------
sc/source/ui/view/cellsh1.cxx | 4
sc/uiconfig/scalc/ui/groupdialog.ui | 119 ++++++++++++-------------
sc/uiconfig/scalc/ui/ungroupdialog.ui | 158 ++++++++++++++++++++++++++++++++++
11 files changed, 241 insertions(+), 178 deletions(-)
New commits:
commit f741d948b6910622d199e8d14ca1e3ecd7475156
Author: Caolán McNamara <caolanm at redhat.com>
Date: Tue Jun 11 13:19:51 2013 +0100
split group dialog into group and ungroup dialogs
Change-Id: If9f8e8a47bd8ce0207b7dec8470375d5fa48f6cd
diff --git a/sc/UIConfig_scalc.mk b/sc/UIConfig_scalc.mk
index 46692c8..5b937a1 100644
--- a/sc/UIConfig_scalc.mk
+++ b/sc/UIConfig_scalc.mk
@@ -84,6 +84,7 @@ $(eval $(call gb_UIConfig_add_uifiles,modules/scalc,\
sc/uiconfig/scalc/ui/optchangespage \
sc/uiconfig/scalc/ui/optcompatibilitypage \
sc/uiconfig/scalc/ui/optdefaultpage \
+ sc/uiconfig/scalc/ui/optdlg \
sc/uiconfig/scalc/ui/printeroptions \
sc/uiconfig/scalc/ui/protectsheetdlg \
sc/uiconfig/scalc/ui/scgeneralpage \
@@ -103,7 +104,7 @@ $(eval $(call gb_UIConfig_add_uifiles,modules/scalc,\
sc/uiconfig/scalc/ui/sortwarning \
sc/uiconfig/scalc/ui/textimportoptions \
sc/uiconfig/scalc/ui/textimportcsv \
- sc/uiconfig/scalc/ui/optdlg \
+ sc/uiconfig/scalc/ui/ungroupdialog \
))
# vim: set noet sw=4 ts=4:
diff --git a/sc/inc/sc.hrc b/sc/inc/sc.hrc
index e98448c..0e9f049 100644
--- a/sc/inc/sc.hrc
+++ b/sc/inc/sc.hrc
@@ -971,7 +971,6 @@
#define RID_SCDLG_SELENTRY (SC_DIALOGS_START + 18)
#define RID_SCDLG_FILLSERIES (SC_DIALOGS_START + 19)
#define RID_SCDLG_AUTOFORMAT (SC_DIALOGS_START + 20)
-#define RID_SCDLG_GROUP (SC_DIALOGS_START + 21)
#define RID_SCDLG_NAMES (SC_DIALOGS_START + 22)
#define RID_SCDLG_DBNAMES (SC_DIALOGS_START + 23)
#define RID_SCDLG_SOLVER (SC_DIALOGS_START + 26)
@@ -1043,10 +1042,6 @@
#define RID_SCDLG_SHOW_TAB (SC_DIALOGS_START + 109)
-// derivations from RID_SCDLG_GROUP
-#define RID_SCDLG_GRP_MAKE (SC_DIALOGS_START + 110)
-#define RID_SCDLG_GRP_KILL (SC_DIALOGS_START + 111)
-
#define RID_SCDLG_COLROWNAMERANGES (SC_DIALOGS_START + 112)
#define RID_SCPAGE_CONTENT (SC_DIALOGS_START + 113)
diff --git a/sc/inc/scabstdlg.hxx b/sc/inc/scabstdlg.hxx
index a041451a..ce45799 100644
--- a/sc/inc/scabstdlg.hxx
+++ b/sc/inc/scabstdlg.hxx
@@ -385,9 +385,8 @@ public:
int nId) = 0;
virtual AbstractScGroupDlg * CreateAbstractScGroupDlg( Window* pParent, //add for ScGroupDlg
- int nId,
- sal_Bool bUnGroup = false,
- sal_Bool bRows = sal_True ) = 0;
+ bool bUnGroup = false,
+ bool bRows = true ) = 0;
virtual AbstractScInsertCellDlg * CreateScInsertCellDlg( Window* pParent, //add for ScInsertCellDlg
int nId,
diff --git a/sc/source/ui/attrdlg/scdlgfact.cxx b/sc/source/ui/attrdlg/scdlgfact.cxx
index fe68814..bc6db22 100644
--- a/sc/source/ui/attrdlg/scdlgfact.cxx
+++ b/sc/source/ui/attrdlg/scdlgfact.cxx
@@ -852,34 +852,14 @@ AbstractScFillSeriesDlg* ScAbstractDialogFactory_Impl::CreateScFillSeriesDlg( Wi
return 0;
}
-
-
-
AbstractScGroupDlg* ScAbstractDialogFactory_Impl::CreateAbstractScGroupDlg( Window* pParent,
- int nId,
- sal_Bool bUnGroup ,
- sal_Bool bRows )
+ bool bUnGroup,
+ bool bRows )
{
- ScGroupDlg * pDlg=NULL;
- switch ( nId )
- {
- case RID_SCDLG_GRP_KILL :
- case RID_SCDLG_GRP_MAKE :
- pDlg = new ScGroupDlg( pParent, bUnGroup, bRows);
- break;
- default:
- break;
- }
-
- if ( pDlg )
- return new AbstractScGroupDlg_Impl( pDlg );
- return 0;
+ ScGroupDlg * pDlg = new ScGroupDlg( pParent, bUnGroup, bRows);
+ return new AbstractScGroupDlg_Impl( pDlg );
}
-
-
-
-
AbstractScInsertCellDlg * ScAbstractDialogFactory_Impl::CreateScInsertCellDlg( Window* pParent,
int nId,
sal_Bool bDisallowCellMove )
diff --git a/sc/source/ui/attrdlg/scdlgfact.hxx b/sc/source/ui/attrdlg/scdlgfact.hxx
index 2be305e..107c238 100644
--- a/sc/source/ui/attrdlg/scdlgfact.hxx
+++ b/sc/source/ui/attrdlg/scdlgfact.hxx
@@ -452,9 +452,8 @@ public:
sal_uInt16 nPossDir,
int nId);
virtual AbstractScGroupDlg * CreateAbstractScGroupDlg( Window* pParent, //add for ScGroupDlg
- int nId,
- sal_Bool bUnGroup = false,
- sal_Bool bRows = sal_True );
+ bool bUnGroup = false,
+ bool bRows = true);
virtual AbstractScInsertCellDlg * CreateScInsertCellDlg( Window* pParent, //add for ScInsertCellDlg
int nId,
diff --git a/sc/source/ui/inc/groupdlg.hxx b/sc/source/ui/inc/groupdlg.hxx
index 538d601..66806de 100644
--- a/sc/source/ui/inc/groupdlg.hxx
+++ b/sc/source/ui/inc/groupdlg.hxx
@@ -30,15 +30,12 @@
class ScGroupDlg : public ModalDialog
{
public:
- ScGroupDlg( Window* pParent,
- sal_Bool bUnGroup = false,
- sal_Bool bRows = sal_True );
- ~ScGroupDlg();
+ ScGroupDlg(Window* pParent, bool bUnGroup = false, bool bRows = true);
+ ~ScGroupDlg();
- sal_Bool GetColsChecked() const;
+ bool GetColsChecked() const;
private:
- FixedText* m_pFtLabel;
RadioButton* m_pBtnRows;
RadioButton* m_pBtnCols;
};
diff --git a/sc/source/ui/miscdlgs/groupdlg.cxx b/sc/source/ui/miscdlgs/groupdlg.cxx
index bc37423..acaecbf 100644
--- a/sc/source/ui/miscdlgs/groupdlg.cxx
+++ b/sc/source/ui/miscdlgs/groupdlg.cxx
@@ -30,16 +30,17 @@
//==================================================================
-ScGroupDlg::ScGroupDlg( Window* pParent,
- sal_Bool bUngroup,
- sal_Bool bRows ) :
- ModalDialog ( pParent, "GroupDialog", "modules/scalc/ui/groupdialog.ui")
+ScGroupDlg::ScGroupDlg(Window* pParent, bool bUngroup, bool bRows)
+ : ModalDialog(pParent,
+ bUngroup ?
+ OString("UngroupDialog") :
+ OString("GroupDialog"),
+ bUngroup ?
+ OUString("modules/scalc/ui/ungroupdialog.ui") :
+ OUString("modules/scalc/ui/groupdialog.ui"))
{
get(m_pBtnRows, "rows");
get(m_pBtnCols, "cols");
- get(m_pFtLabel, bUngroup ? "deactivateLabel" : "includeLabel");
-
- m_pFtLabel->Show();
if ( bRows )
m_pBtnRows->Check();
@@ -51,7 +52,7 @@ ScGroupDlg::ScGroupDlg( Window* pParent,
//------------------------------------------------------------------------
-sal_Bool ScGroupDlg::GetColsChecked() const
+bool ScGroupDlg::GetColsChecked() const
{
return m_pBtnCols->IsChecked();
}
diff --git a/sc/source/ui/src/miscdlgs.src b/sc/source/ui/src/miscdlgs.src
index 74f7ea1..391ebb7 100644
--- a/sc/source/ui/src/miscdlgs.src
+++ b/sc/source/ui/src/miscdlgs.src
@@ -929,72 +929,6 @@ ModalDialog RID_SCDLG_FILLSERIES
Text [ en-US ] = "~Rows" ; \
-ModalDialog RID_SCDLG_GROUP
-{
- HelpID = "sc:ModalDialog:RID_SCDLG_GROUP";
- OutputSize = TRUE ;
- SVLook = TRUE ;
- Size = MAP_APPFONT ( 148 , 63 ) ;
- Moveable = TRUE ;
- Closeable = FALSE ;
- OKButton BTN_OK
- {
- Pos = MAP_APPFONT ( 92 , 6 ) ;
- Size = MAP_APPFONT ( 50 , 14 ) ;
- TabStop = TRUE ;
- DefButton = TRUE ;
- };
- CancelButton BTN_CANCEL
- {
- Pos = MAP_APPFONT ( 92 , 23 ) ;
- Size = MAP_APPFONT ( 50 , 14 ) ;
- TabStop = TRUE ;
- };
- HelpButton BTN_HELP
- {
- Pos = MAP_APPFONT ( 92 , 43 ) ;
- Size = MAP_APPFONT ( 50 , 14 ) ;
- TabStop = TRUE ;
- };
- RadioButton BTN_GROUP_ROWS
- {
- // HelpID, weil die generierten aus den Ableitungen nicht in die hid.lst kommen
- HelpId = HID_SC_GROUP_ROWS ;
- Pos = MAP_APPFONT ( 12 , 14 ) ;
- Size = MAP_APPFONT ( 71 , 10 ) ;
- TXT_ROWS
- TabStop = TRUE ;
- };
- RadioButton BTN_GROUP_COLS
- {
- // HelpID, weil die generierten aus den Ableitungen nicht in die hid.lst kommen
- HelpId = HID_SC_GROUP_COLS ;
- Pos = MAP_APPFONT ( 12 , 28 ) ;
- Size = MAP_APPFONT ( 71 , 10 ) ;
- TXT_COLS
- TabStop = TRUE ;
- };
- FixedLine FL_FRAME
- {
- Pos = MAP_APPFONT ( 6 , 3 ) ;
- Size = MAP_APPFONT ( 80 , 8 ) ;
- Text = "Aktivieren für" ;
- };
- String STR_GROUP
- {
- Text [ en-US ] = "Include" ;
- };
- String STR_UNGROUP
- {
- Text [ en-US ] = "Deactivate for" ;
- };
- Text [ en-US ] = "Group" ;
-};
-
- // Ableitungen
-ModalDialog RID_SCDLG_GRP_MAKE < RID_SCDLG_GROUP { HelpId = CMD_SID_OUTLINE_MAKE ; };
-ModalDialog RID_SCDLG_GRP_KILL < RID_SCDLG_GROUP { HelpId = CMD_SID_OUTLINE_REMOVE ; };
-
// RID_SCDLG_COLORROW wird nur in der Optionen-Sortierlisten-Seite benutzt
ModalDialog RID_SCDLG_COLORROW
diff --git a/sc/source/ui/view/cellsh1.cxx b/sc/source/ui/view/cellsh1.cxx
index 26e13a1..7873b27 100644
--- a/sc/source/ui/view/cellsh1.cxx
+++ b/sc/source/ui/view/cellsh1.cxx
@@ -1025,7 +1025,7 @@ void ScCellShell::ExecuteEdit( SfxRequest& rReq )
ScAbstractDialogFactory* pFact = ScAbstractDialogFactory::Create();
OSL_ENSURE(pFact, "ScAbstractFactory create fail!");
- AbstractScGroupDlg* pDlg = pFact->CreateAbstractScGroupDlg( pTabViewShell->GetDialogParent(), RID_SCDLG_GRP_MAKE, false);
+ AbstractScGroupDlg* pDlg = pFact->CreateAbstractScGroupDlg(pTabViewShell->GetDialogParent(), false);
OSL_ENSURE(pDlg, "Dialog create fail!");
if ( pDlg->Execute() == RET_OK )
bColumns = pDlg->GetColsChecked();
@@ -1085,7 +1085,7 @@ void ScCellShell::ExecuteEdit( SfxRequest& rReq )
ScAbstractDialogFactory* pFact = ScAbstractDialogFactory::Create();
OSL_ENSURE(pFact, "ScAbstractFactory create fail!");
- AbstractScGroupDlg* pDlg = pFact->CreateAbstractScGroupDlg( pTabViewShell->GetDialogParent(), RID_SCDLG_GRP_KILL, true);
+ AbstractScGroupDlg* pDlg = pFact->CreateAbstractScGroupDlg(pTabViewShell->GetDialogParent(), true);
OSL_ENSURE(pDlg, "Dialog create fail!");
if ( pDlg->Execute() == RET_OK )
bColumns = pDlg->GetColsChecked();
diff --git a/sc/uiconfig/scalc/ui/groupdialog.ui b/sc/uiconfig/scalc/ui/groupdialog.ui
index eb3dbd2..0f913bd 100644
--- a/sc/uiconfig/scalc/ui/groupdialog.ui
+++ b/sc/uiconfig/scalc/ui/groupdialog.ui
@@ -9,12 +9,12 @@
<child internal-child="vbox">
<object class="GtkBox" id="dialog-vbox1">
<property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
<property name="spacing">12</property>
<child internal-child="action_area">
<object class="GtkButtonBox" id="dialog-action_area1">
<property name="can_focus">False</property>
- <property name="orientation">vertical</property>
- <property name="layout_style">start</property>
+ <property name="layout_style">end</property>
<child>
<object class="GtkButton" id="ok">
<property name="label">gtk-ok</property>
@@ -69,77 +69,76 @@
</packing>
</child>
<child>
- <object class="GtkBox" id="box1">
+ <object class="GtkFrame" id="frame1">
<property name="visible">True</property>
<property name="can_focus">False</property>
+ <property name="hexpand">True</property>
<property name="vexpand">True</property>
- <property name="orientation">vertical</property>
- <property name="spacing">6</property>
+ <property name="label_xalign">0</property>
+ <property name="shadow_type">none</property>
<child>
- <object class="GtkLabel" id="includeLabel">
+ <object class="GtkAlignment" id="alignment1">
+ <property name="visible">True</property>
<property name="can_focus">False</property>
- <property name="hexpand">True</property>
- <property name="xalign">0</property>
- <property name="label" translatable="yes">Include</property>
- <attributes>
- <attribute name="weight" value="bold"/>
- </attributes>
+ <property name="top_padding">6</property>
+ <property name="left_padding">12</property>
+ <child>
+ <object class="GtkBox" id="box1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">6</property>
+ <child>
+ <object class="GtkRadioButton" id="rows">
+ <property name="label" translatable="yes">_Rows</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_underline">True</property>
+ <property name="xalign">0</property>
+ <property name="active">True</property>
+ <property name="draw_indicator">True</property>
+ <property name="group">cols</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkRadioButton" id="cols">
+ <property name="label" translatable="yes">_Columns</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_underline">True</property>
+ <property name="xalign">0</property>
+ <property name="draw_indicator">True</property>
+ <property name="group">rows</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ </child>
</object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">0</property>
- </packing>
</child>
- <child>
- <object class="GtkLabel" id="deactivateLabel">
+ <child type="label">
+ <object class="GtkLabel" id="includeLabel">
+ <property name="visible">True</property>
<property name="can_focus">False</property>
+ <property name="hexpand">True</property>
<property name="xalign">0</property>
- <property name="label" translatable="yes">Deactivate for</property>
+ <property name="label" translatable="yes">Include</property>
<attributes>
<attribute name="weight" value="bold"/>
</attributes>
</object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">1</property>
- </packing>
- </child>
- <child>
- <object class="GtkRadioButton" id="rows">
- <property name="label" translatable="yes">_Rows</property>
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="receives_default">False</property>
- <property name="use_underline">True</property>
- <property name="xalign">0</property>
- <property name="active">True</property>
- <property name="draw_indicator">True</property>
- <property name="group">cols</property>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">3</property>
- </packing>
- </child>
- <child>
- <object class="GtkRadioButton" id="cols">
- <property name="label" translatable="yes">_Columns</property>
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="receives_default">False</property>
- <property name="use_underline">True</property>
- <property name="xalign">0</property>
- <property name="draw_indicator">True</property>
- <property name="group">rows</property>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">4</property>
- </packing>
</child>
</object>
<packing>
diff --git a/sc/uiconfig/scalc/ui/ungroupdialog.ui b/sc/uiconfig/scalc/ui/ungroupdialog.ui
new file mode 100644
index 0000000..112bf8f
--- /dev/null
+++ b/sc/uiconfig/scalc/ui/ungroupdialog.ui
@@ -0,0 +1,158 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+ <!-- interface-requires gtk+ 3.0 -->
+ <object class="GtkDialog" id="UngroupDialog">
+ <property name="can_focus">False</property>
+ <property name="border_width">6</property>
+ <property name="title" translatable="yes">Ungroup</property>
+ <property name="type_hint">dialog</property>
+ <child internal-child="vbox">
+ <object class="GtkBox" id="dialog-vbox1">
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">12</property>
+ <child internal-child="action_area">
+ <object class="GtkButtonBox" id="dialog-action_area1">
+ <property name="can_focus">False</property>
+ <property name="layout_style">end</property>
+ <child>
+ <object class="GtkButton" id="ok">
+ <property name="label">gtk-ok</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="can_default">True</property>
+ <property name="has_default">True</property>
+ <property name="receives_default">True</property>
+ <property name="use_stock">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="cancel">
+ <property name="label">gtk-cancel</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use_stock">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="help">
+ <property name="label">gtk-help</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use_stock">True</property>
+ <property name="image_position">top</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="pack_type">end</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkFrame" id="frame1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <property name="label_xalign">0</property>
+ <property name="shadow_type">none</property>
+ <child>
+ <object class="GtkAlignment" id="alignment1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="top_padding">6</property>
+ <property name="left_padding">12</property>
+ <child>
+ <object class="GtkBox" id="box1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">6</property>
+ <child>
+ <object class="GtkRadioButton" id="rows">
+ <property name="label" translatable="yes">_Rows</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_underline">True</property>
+ <property name="xalign">0</property>
+ <property name="active">True</property>
+ <property name="draw_indicator">True</property>
+ <property name="group">cols</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkRadioButton" id="cols">
+ <property name="label" translatable="yes">_Columns</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_underline">True</property>
+ <property name="xalign">0</property>
+ <property name="draw_indicator">True</property>
+ <property name="group">rows</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="includeLabel">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="hexpand">True</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">Deactivate for</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ <action-widgets>
+ <action-widget response="0">ok</action-widget>
+ <action-widget response="0">cancel</action-widget>
+ <action-widget response="0">help</action-widget>
+ </action-widgets>
+ </object>
+</interface>
More information about the Libreoffice-commits
mailing list