Skip to content
Projeler
Gruplar
Parçacıklar
Yardım
Yükleniyor...
Oturum aç / Kaydol
Gezinmeyi değiştir
C
core
Proje
Proje
Ayrıntılar
Etkinlik
Cycle Analytics
Depo (repository)
Depo (repository)
Dosyalar
Kayıtlar (commit)
Dallar (branch)
Etiketler
Katkıda bulunanlar
Grafik
Karşılaştır
Grafikler
Konular (issue)
0
Konular (issue)
0
Liste
Pano
Etiketler
Kilometre Taşları
Birleştirme (merge) Talepleri
0
Birleştirme (merge) Talepleri
0
CI / CD
CI / CD
İş akışları (pipeline)
İşler
Zamanlamalar
Grafikler
Paketler
Paketler
Wiki
Wiki
Parçacıklar
Parçacıklar
Üyeler
Üyeler
Collapse sidebar
Close sidebar
Etkinlik
Grafik
Grafikler
Yeni bir konu (issue) oluştur
İşler
Kayıtlar (commit)
Konu (issue) Panoları
Kenar çubuğunu aç
LibreOffice
core
Commits
a48d8465
Kaydet (Commit)
a48d8465
authored
Ara 29, 2014
tarafından
Noel Grandin
Dosyalara gözat
Seçenekler
Dosyalara Gözat
İndir
Eposta Yamaları
Sade Fark
fdo#84938: convert SELENG_ #defines to 'enum class'
Change-Id: I200fc00958984577ced6d2df87c8e9647b43c809
üst
64cccf36
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
85 additions
and
75 deletions
+85
-75
seleng.hxx
include/vcl/seleng.hxx
+30
-24
seleng.cxx
vcl/source/window/seleng.cxx
+55
-51
No files found.
include/vcl/seleng.hxx
Dosyayı görüntüle @
a48d8465
...
...
@@ -23,6 +23,7 @@
#include <vcl/dllapi.h>
#include <vcl/timer.hxx>
#include <vcl/event.hxx>
#include <o3tl/typed_flags_set.hxx>
namespace
vcl
{
class
Window
;
}
class
CommandEvent
;
...
...
@@ -63,15 +64,20 @@ public:
// - SelectionEngine -
#define SELENG_DRG_ENAB 0x0001
#define SELENG_IN_SEL 0x0002
#define SELENG_IN_ADD 0x0004
#define SELENG_ADD_ALW 0x0008
#define SELENG_HAS_ANCH 0x0020
#define SELENG_CMDEVT 0x0040
#define SELENG_WAIT_UPEVT 0x0080
#define SELENG_EXPANDONMOVE 0x0100
enum
class
SelectionEngineFlags
{
DRG_ENAB
=
0x0001
,
IN_SEL
=
0x0002
,
IN_ADD
=
0x0004
,
ADD_ALW
=
0x0008
,
HAS_ANCH
=
0x0020
,
CMDEVT
=
0x0040
,
WAIT_UPEVT
=
0x0080
,
EXPANDONMOVE
=
0x0100
,
};
namespace
o3tl
{
template
<>
struct
typed_flags
<
SelectionEngineFlags
>
:
is_typed_flags
<
SelectionEngineFlags
,
0x01ff
>
{};
}
class
VCL_DLLPUBLIC
SelectionEngine
{
...
...
@@ -84,7 +90,7 @@ private:
SelectionMode
eSelMode
;
sal_uLong
nUpdateInterval
;
sal_uInt16
nLockedMods
;
sal_uInt16
nFlags
;
SelectionEngineFlags
nFlags
;
DECL_DLLPRIVATE_LINK
(
ImpWatchDog
,
void
*
);
inline
bool
ShouldDeselect
(
bool
bModifierKey1
)
const
;
...
...
@@ -157,15 +163,15 @@ public:
void
ExpandSelectionOnMouseMove
(
bool
bExpand
=
true
)
{
if
(
bExpand
)
nFlags
|=
S
ELENG_
EXPANDONMOVE
;
nFlags
|=
S
electionEngineFlags
::
EXPANDONMOVE
;
else
nFlags
&=
~
S
ELENG_
EXPANDONMOVE
;
nFlags
&=
~
S
electionEngineFlags
::
EXPANDONMOVE
;
}
};
inline
bool
SelectionEngine
::
IsAddMode
()
const
{
if
(
nFlags
&
(
S
ELENG_IN_ADD
|
SELENG_
ADD_ALW
)
)
if
(
nFlags
&
(
S
electionEngineFlags
::
IN_ADD
|
SelectionEngineFlags
::
ADD_ALW
)
)
return
true
;
else
return
false
;
...
...
@@ -174,30 +180,30 @@ inline bool SelectionEngine::IsAddMode() const
inline
void
SelectionEngine
::
SetAddMode
(
bool
bNewMode
)
{
if
(
bNewMode
)
nFlags
|=
S
ELENG_
IN_ADD
;
nFlags
|=
S
electionEngineFlags
::
IN_ADD
;
else
nFlags
&=
(
~
S
ELENG_
IN_ADD
);
nFlags
&=
(
~
S
electionEngineFlags
::
IN_ADD
);
}
inline
void
SelectionEngine
::
EnableDrag
(
bool
bOn
)
{
if
(
bOn
)
nFlags
|=
S
ELENG_
DRG_ENAB
;
nFlags
|=
S
electionEngineFlags
::
DRG_ENAB
;
else
nFlags
&=
(
~
S
ELENG_
DRG_ENAB
);
nFlags
&=
(
~
S
electionEngineFlags
::
DRG_ENAB
);
}
inline
void
SelectionEngine
::
AddAlways
(
bool
bOn
)
{
if
(
bOn
)
nFlags
|=
S
ELENG_
ADD_ALW
;
nFlags
|=
S
electionEngineFlags
::
ADD_ALW
;
else
nFlags
&=
(
~
S
ELENG_
ADD_ALW
);
nFlags
&=
(
~
S
electionEngineFlags
::
ADD_ALW
);
}
inline
bool
SelectionEngine
::
IsAlwaysAdding
()
const
{
if
(
nFlags
&
S
ELENG_
ADD_ALW
)
if
(
nFlags
&
S
electionEngineFlags
::
ADD_ALW
)
return
true
;
else
return
false
;
...
...
@@ -205,7 +211,7 @@ inline bool SelectionEngine::IsAlwaysAdding() const
inline
bool
SelectionEngine
::
IsInSelection
()
const
{
if
(
nFlags
&
S
ELENG_
IN_SEL
)
if
(
nFlags
&
S
electionEngineFlags
::
IN_SEL
)
return
true
;
else
return
false
;
...
...
@@ -213,7 +219,7 @@ inline bool SelectionEngine::IsInSelection() const
inline
bool
SelectionEngine
::
HasAnchor
()
const
{
if
(
nFlags
&
S
ELENG_
HAS_ANCH
)
if
(
nFlags
&
S
electionEngineFlags
::
HAS_ANCH
)
return
true
;
else
return
false
;
...
...
@@ -222,9 +228,9 @@ inline bool SelectionEngine::HasAnchor() const
inline
void
SelectionEngine
::
SetAnchor
(
bool
bAnchor
)
{
if
(
bAnchor
)
nFlags
|=
S
ELENG_
HAS_ANCH
;
nFlags
|=
S
electionEngineFlags
::
HAS_ANCH
;
else
nFlags
&=
(
~
S
ELENG_
HAS_ANCH
);
nFlags
&=
(
~
S
electionEngineFlags
::
HAS_ANCH
);
}
#endif // INCLUDED_VCL_SELENG_HXX
...
...
vcl/source/window/seleng.cxx
Dosyayı görüntüle @
a48d8465
...
...
@@ -39,7 +39,7 @@ SelectionEngine::SelectionEngine( vcl::Window* pWindow, FunctionSet* pFuncSet,
{
eSelMode
=
SINGLE_SELECTION
;
pFunctionSet
=
pFuncSet
;
nFlags
=
S
ELENG_
EXPANDONMOVE
;
nFlags
=
S
electionEngineFlags
::
EXPANDONMOVE
;
nLockedMods
=
0
;
aWTimer
.
SetTimeoutHdl
(
LINK
(
this
,
SelectionEngine
,
ImpWatchDog
)
);
...
...
@@ -72,20 +72,20 @@ void SelectionEngine::CursorPosChanging( bool bShift, bool bMod1 )
{
if
(
IsAddMode
()
)
{
if
(
!
(
nFlags
&
S
ELENG_
HAS_ANCH
)
)
if
(
!
(
nFlags
&
S
electionEngineFlags
::
HAS_ANCH
)
)
{
pFunctionSet
->
CreateAnchor
();
nFlags
|=
S
ELENG_
HAS_ANCH
;
nFlags
|=
S
electionEngineFlags
::
HAS_ANCH
;
}
}
else
{
if
(
!
(
nFlags
&
S
ELENG_
HAS_ANCH
)
)
if
(
!
(
nFlags
&
S
electionEngineFlags
::
HAS_ANCH
)
)
{
if
(
ShouldDeselect
(
bMod1
)
)
pFunctionSet
->
DeselectAll
();
pFunctionSet
->
CreateAnchor
();
nFlags
|=
S
ELENG_
HAS_ANCH
;
nFlags
|=
S
electionEngineFlags
::
HAS_ANCH
;
}
}
}
...
...
@@ -93,11 +93,11 @@ void SelectionEngine::CursorPosChanging( bool bShift, bool bMod1 )
{
if
(
IsAddMode
()
)
{
if
(
nFlags
&
S
ELENG_
HAS_ANCH
)
if
(
nFlags
&
S
electionEngineFlags
::
HAS_ANCH
)
{
// pFunctionSet->CreateCursor();
pFunctionSet
->
DestroyAnchor
();
nFlags
&=
(
~
S
ELENG_
HAS_ANCH
);
nFlags
&=
(
~
S
electionEngineFlags
::
HAS_ANCH
);
}
}
else
...
...
@@ -106,14 +106,14 @@ void SelectionEngine::CursorPosChanging( bool bShift, bool bMod1 )
pFunctionSet
->
DeselectAll
();
else
pFunctionSet
->
DestroyAnchor
();
nFlags
&=
(
~
S
ELENG_
HAS_ANCH
);
nFlags
&=
(
~
S
electionEngineFlags
::
HAS_ANCH
);
}
}
}
bool
SelectionEngine
::
SelMouseButtonDown
(
const
MouseEvent
&
rMEvt
)
{
nFlags
&=
(
~
S
ELENG_
CMDEVT
);
nFlags
&=
(
~
S
electionEngineFlags
::
CMDEVT
);
if
(
!
pFunctionSet
||
!
pWin
||
rMEvt
.
GetClicks
()
>
1
||
rMEvt
.
IsRight
()
)
return
false
;
...
...
@@ -131,7 +131,7 @@ bool SelectionEngine::SelMouseButtonDown( const MouseEvent& rMEvt )
if
(
!
rMEvt
.
IsRight
()
)
{
pWin
->
CaptureMouse
();
nFlags
|=
S
ELENG_
IN_SEL
;
nFlags
|=
S
electionEngineFlags
::
IN_SEL
;
}
else
{
...
...
@@ -143,11 +143,11 @@ bool SelectionEngine::SelMouseButtonDown( const MouseEvent& rMEvt )
case
0
:
// KEY_NO_KEY
{
bool
bSelAtPoint
=
pFunctionSet
->
IsSelectionAtPoint
(
aPos
);
nFlags
&=
(
~
S
ELENG_
IN_ADD
);
if
(
(
nFlags
&
S
ELENG_
DRG_ENAB
)
&&
bSelAtPoint
)
nFlags
&=
(
~
S
electionEngineFlags
::
IN_ADD
);
if
(
(
nFlags
&
S
electionEngineFlags
::
DRG_ENAB
)
&&
bSelAtPoint
)
{
nFlags
|=
S
ELENG_
WAIT_UPEVT
;
nFlags
&=
~
(
S
ELENG_
IN_SEL
);
nFlags
|=
S
electionEngineFlags
::
WAIT_UPEVT
;
nFlags
&=
~
(
S
electionEngineFlags
::
IN_SEL
);
pWin
->
ReleaseMouse
();
return
true
;
// wait for STARTDRAG-Command-Event
}
...
...
@@ -157,12 +157,12 @@ bool SelectionEngine::SelMouseButtonDown( const MouseEvent& rMEvt )
pFunctionSet
->
DeselectAll
();
else
pFunctionSet
->
DestroyAnchor
();
nFlags
&=
(
~
S
ELENG_
HAS_ANCH
);
// bHasAnchor = false;
nFlags
&=
(
~
S
electionEngineFlags
::
HAS_ANCH
);
// bHasAnchor = false;
}
pFunctionSet
->
SetCursorAtPoint
(
aPos
);
// special case Single-Selection, to enable simple Select+Drag
if
(
eSelMode
==
SINGLE_SELECTION
&&
(
nFlags
&
S
ELENG_
DRG_ENAB
))
nFlags
|=
S
ELENG_
WAIT_UPEVT
;
if
(
eSelMode
==
SINGLE_SELECTION
&&
(
nFlags
&
S
electionEngineFlags
::
DRG_ENAB
))
nFlags
|=
S
electionEngineFlags
::
WAIT_UPEVT
;
return
true
;
}
...
...
@@ -170,20 +170,20 @@ bool SelectionEngine::SelMouseButtonDown( const MouseEvent& rMEvt )
if
(
eSelMode
==
SINGLE_SELECTION
)
{
pWin
->
ReleaseMouse
();
nFlags
&=
(
~
S
ELENG_
IN_SEL
);
nFlags
&=
(
~
S
electionEngineFlags
::
IN_SEL
);
return
false
;
}
if
(
nFlags
&
S
ELENG_
ADD_ALW
)
nFlags
|=
S
ELENG_
IN_ADD
;
if
(
nFlags
&
S
electionEngineFlags
::
ADD_ALW
)
nFlags
|=
S
electionEngineFlags
::
IN_ADD
;
else
nFlags
&=
(
~
S
ELENG_
IN_ADD
);
nFlags
&=
(
~
S
electionEngineFlags
::
IN_ADD
);
if
(
!
(
nFlags
&
S
ELENG_
HAS_ANCH
)
)
if
(
!
(
nFlags
&
S
electionEngineFlags
::
HAS_ANCH
)
)
{
if
(
!
(
nFlags
&
S
ELENG_
IN_ADD
)
)
if
(
!
(
nFlags
&
S
electionEngineFlags
::
IN_ADD
)
)
pFunctionSet
->
DeselectAll
();
pFunctionSet
->
CreateAnchor
();
nFlags
|=
S
ELENG_
HAS_ANCH
;
nFlags
|=
S
electionEngineFlags
::
HAS_ANCH
;
}
pFunctionSet
->
SetCursorAtPoint
(
aPos
);
return
true
;
...
...
@@ -192,15 +192,15 @@ bool SelectionEngine::SelMouseButtonDown( const MouseEvent& rMEvt )
// allow Control only for Multi-Select
if
(
eSelMode
!=
MULTIPLE_SELECTION
)
{
nFlags
&=
(
~
S
ELENG_
IN_SEL
);
nFlags
&=
(
~
S
electionEngineFlags
::
IN_SEL
);
pWin
->
ReleaseMouse
();
return
true
;
// skip Mouse-Click
}
if
(
nFlags
&
S
ELENG_
HAS_ANCH
)
if
(
nFlags
&
S
electionEngineFlags
::
HAS_ANCH
)
{
// pFunctionSet->CreateCursor();
pFunctionSet
->
DestroyAnchor
();
nFlags
&=
(
~
S
ELENG_
HAS_ANCH
);
nFlags
&=
(
~
S
electionEngineFlags
::
HAS_ANCH
);
}
if
(
pFunctionSet
->
IsSelectionAtPoint
(
aPos
)
)
{
...
...
@@ -217,14 +217,14 @@ bool SelectionEngine::SelMouseButtonDown( const MouseEvent& rMEvt )
if
(
eSelMode
!=
MULTIPLE_SELECTION
)
{
pWin
->
ReleaseMouse
();
nFlags
&=
(
~
S
ELENG_
IN_SEL
);
nFlags
&=
(
~
S
electionEngineFlags
::
IN_SEL
);
return
false
;
}
nFlags
|=
S
ELENG_
IN_ADD
;
//bIsInAddMode = true;
if
(
!
(
nFlags
&
S
ELENG_
HAS_ANCH
)
)
nFlags
|=
S
electionEngineFlags
::
IN_ADD
;
//bIsInAddMode = true;
if
(
!
(
nFlags
&
S
electionEngineFlags
::
HAS_ANCH
)
)
{
pFunctionSet
->
CreateAnchor
();
nFlags
|=
S
ELENG_
HAS_ANCH
;
nFlags
|=
S
electionEngineFlags
::
HAS_ANCH
;
}
pFunctionSet
->
SetCursorAtPoint
(
aPos
);
return
true
;
...
...
@@ -238,7 +238,8 @@ bool SelectionEngine::SelMouseButtonUp( const MouseEvent& rMEvt )
aWTimer
.
Stop
();
if
(
!
pFunctionSet
||
!
pWin
)
{
nFlags
&=
~
(
SELENG_CMDEVT
|
SELENG_WAIT_UPEVT
|
SELENG_IN_SEL
);
const
SelectionEngineFlags
nMask
=
(
SelectionEngineFlags
::
CMDEVT
|
SelectionEngineFlags
::
WAIT_UPEVT
|
SelectionEngineFlags
::
IN_SEL
);
nFlags
&=
~
nMask
;
return
false
;
}
...
...
@@ -247,7 +248,7 @@ bool SelectionEngine::SelMouseButtonUp( const MouseEvent& rMEvt )
ReleaseMouse
();
}
if
(
(
nFlags
&
S
ELENG_WAIT_UPEVT
)
&&
!
(
nFlags
&
SELENG_
CMDEVT
)
&&
if
(
(
nFlags
&
S
electionEngineFlags
::
WAIT_UPEVT
)
&&
!
(
nFlags
&
SelectionEngineFlags
::
CMDEVT
)
&&
eSelMode
!=
SINGLE_SELECTION
)
{
// MouseButtonDown in Sel but no CommandEvent yet
...
...
@@ -258,21 +259,22 @@ bool SelectionEngine::SelMouseButtonUp( const MouseEvent& rMEvt )
if
(
!
(
nModifier
&
KEY_SHIFT
)
)
{
pFunctionSet
->
DestroyAnchor
();
nFlags
&=
(
~
S
ELENG_
HAS_ANCH
);
// uncheck anchor
nFlags
&=
(
~
S
electionEngineFlags
::
HAS_ANCH
);
// uncheck anchor
}
pFunctionSet
->
DeselectAtPoint
(
aLastMove
.
GetPosPixel
()
);
nFlags
&=
(
~
S
ELENG_
HAS_ANCH
);
// uncheck anchor
nFlags
&=
(
~
S
electionEngineFlags
::
HAS_ANCH
);
// uncheck anchor
pFunctionSet
->
SetCursorAtPoint
(
aLastMove
.
GetPosPixel
(),
true
);
}
else
{
pFunctionSet
->
DeselectAll
();
nFlags
&=
(
~
S
ELENG_
HAS_ANCH
);
// uncheck anchor
nFlags
&=
(
~
S
electionEngineFlags
::
HAS_ANCH
);
// uncheck anchor
pFunctionSet
->
SetCursorAtPoint
(
aLastMove
.
GetPosPixel
()
);
}
}
nFlags
&=
~
(
SELENG_CMDEVT
|
SELENG_WAIT_UPEVT
|
SELENG_IN_SEL
);
const
SelectionEngineFlags
nMask
=
(
SelectionEngineFlags
::
CMDEVT
|
SelectionEngineFlags
::
WAIT_UPEVT
|
SelectionEngineFlags
::
IN_SEL
);
nFlags
&=
~
nMask
;
return
true
;
}
...
...
@@ -286,11 +288,11 @@ void SelectionEngine::ReleaseMouse()
bool
SelectionEngine
::
SelMouseMove
(
const
MouseEvent
&
rMEvt
)
{
if
(
!
pFunctionSet
||
!
(
nFlags
&
S
ELENG_
IN_SEL
)
||
(
nFlags
&
(
S
ELENG_CMDEVT
|
SELENG_
WAIT_UPEVT
))
)
if
(
!
pFunctionSet
||
!
(
nFlags
&
S
electionEngineFlags
::
IN_SEL
)
||
(
nFlags
&
(
S
electionEngineFlags
::
CMDEVT
|
SelectionEngineFlags
::
WAIT_UPEVT
))
)
return
false
;
if
(
!
(
nFlags
&
S
ELENG_
EXPANDONMOVE
)
)
if
(
!
(
nFlags
&
S
electionEngineFlags
::
EXPANDONMOVE
)
)
return
false
;
// wait for DragEvent!
aLastMove
=
rMEvt
;
...
...
@@ -303,10 +305,10 @@ bool SelectionEngine::SelMouseMove( const MouseEvent& rMEvt )
aWTimer
.
Start
();
if
(
eSelMode
!=
SINGLE_SELECTION
)
{
if
(
!
(
nFlags
&
S
ELENG_
HAS_ANCH
)
)
if
(
!
(
nFlags
&
S
electionEngineFlags
::
HAS_ANCH
)
)
{
pFunctionSet
->
CreateAnchor
();
nFlags
|=
S
ELENG_
HAS_ANCH
;
nFlags
|=
S
electionEngineFlags
::
HAS_ANCH
;
}
}
...
...
@@ -319,10 +321,10 @@ void SelectionEngine::SetWindow( vcl::Window* pNewWin )
{
if
(
pNewWin
!=
pWin
)
{
if
(
pWin
&&
(
nFlags
&
S
ELENG_
IN_SEL
)
)
if
(
pWin
&&
(
nFlags
&
S
electionEngineFlags
::
IN_SEL
)
)
pWin
->
ReleaseMouse
();
pWin
=
pNewWin
;
if
(
pWin
&&
(
nFlags
&
S
ELENG_
IN_SEL
)
)
if
(
pWin
&&
(
nFlags
&
S
electionEngineFlags
::
IN_SEL
)
)
pWin
->
CaptureMouse
();
}
}
...
...
@@ -330,9 +332,10 @@ void SelectionEngine::SetWindow( vcl::Window* pNewWin )
void
SelectionEngine
::
Reset
()
{
aWTimer
.
Stop
();
if
(
nFlags
&
S
ELENG_
IN_SEL
)
if
(
nFlags
&
S
electionEngineFlags
::
IN_SEL
)
pWin
->
ReleaseMouse
();
nFlags
&=
~
(
SELENG_HAS_ANCH
|
SELENG_IN_SEL
);
SelectionEngineFlags
nMask
=
(
SelectionEngineFlags
::
HAS_ANCH
|
SelectionEngineFlags
::
IN_SEL
);
nFlags
&=
~
nMask
;
nLockedMods
=
0
;
}
...
...
@@ -342,10 +345,10 @@ void SelectionEngine::Command( const CommandEvent& rCEvt )
if
(
!
pFunctionSet
||
!
pWin
||
aWTimer
.
IsActive
()
)
return
;
aWTimer
.
Stop
();
nFlags
|=
S
ELENG_
CMDEVT
;
nFlags
|=
S
electionEngineFlags
::
CMDEVT
;
if
(
rCEvt
.
GetCommand
()
==
COMMAND_STARTDRAG
)
{
if
(
nFlags
&
S
ELENG_
DRG_ENAB
)
if
(
nFlags
&
S
electionEngineFlags
::
DRG_ENAB
)
{
DBG_ASSERT
(
rCEvt
.
IsMouseEvent
(),
"STARTDRAG: Not a MouseEvent"
);
if
(
pFunctionSet
->
IsSelectionAtPoint
(
rCEvt
.
GetMousePosPixel
()
)
)
...
...
@@ -354,13 +357,14 @@ void SelectionEngine::Command( const CommandEvent& rCEvt )
aLastMove
.
GetClicks
(),
aLastMove
.
GetMode
(),
aLastMove
.
GetButtons
(),
aLastMove
.
GetModifier
()
);
pFunctionSet
->
BeginDrag
();
nFlags
&=
~
(
SELENG_CMDEVT
|
SELENG_WAIT_UPEVT
|
SELENG_IN_SEL
);
const
SelectionEngineFlags
nMask
=
(
SelectionEngineFlags
::
CMDEVT
|
SelectionEngineFlags
::
WAIT_UPEVT
|
SelectionEngineFlags
::
IN_SEL
);
nFlags
&=
~
nMask
;
}
else
nFlags
&=
~
S
ELENG_
CMDEVT
;
nFlags
&=
~
S
electionEngineFlags
::
CMDEVT
;
}
else
nFlags
&=
~
S
ELENG_
CMDEVT
;
nFlags
&=
~
S
electionEngineFlags
::
CMDEVT
;
}
}
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment