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
613f8a31
Kaydet (Commit)
613f8a31
authored
Eyl 04, 2012
tarafından
Noel Power
Dosyalara gözat
Seçenekler
Dosyalara Gözat
İndir
Eposta Yamaları
Sade Fark
attempt own scroll
Change-Id: I4abc00bf4fcebb098b63cc2c3638e0d573381ca5
üst
744d6e22
Hide whitespace changes
Inline
Side-by-side
Showing
9 changed files
with
178 additions
and
32 deletions
+178
-32
formres.src
extensions/source/propctrlr/formres.src
+16
-0
formresid.hrc
extensions/source/propctrlr/formresid.hrc
+4
-0
formstrings.hxx
extensions/source/propctrlr/formstrings.hxx
+4
-0
scrollabledialog.hxx
toolkit/inc/toolkit/awt/scrollabledialog.hxx
+20
-1
property.hxx
toolkit/inc/toolkit/helper/property.hxx
+2
-0
scrollabledialog.cxx
toolkit/source/awt/scrollabledialog.cxx
+125
-29
vclxtoolkit.cxx
toolkit/source/awt/vclxtoolkit.cxx
+3
-2
dialogcontrol.cxx
toolkit/source/controls/dialogcontrol.cxx
+2
-0
property.cxx
toolkit/source/helper/property.cxx
+2
-0
No files found.
extensions/source/propctrlr/formres.src
Dosyayı görüntüle @
613f8a31
...
...
@@ -919,6 +919,22 @@ String RID_STR_SCROLLVALUE_MIN
{
Text [ en-US ] = "Scroll value min.";
};
String RID_STR_SCROLL_WIDTH
{
Text [ en-US ] = "Scroll width";
};
String RID_STR_SCROLL_HEIGHT
{
Text [ en-US ] = "Scroll height";
};
String RID_STR_SCROLL_TOP
{
Text [ en-US ] = "Scroll top";
};
String RID_STR_SCROLL_LEFT
{
Text [ en-US ] = "Scroll left";
};
String RID_STR_DEFAULT_SCROLLVALUE
{
Text [ en-US ] = "Default scroll value";
...
...
extensions/source/propctrlr/formresid.hrc
Dosyayı görüntüle @
613f8a31
...
...
@@ -262,6 +262,10 @@
#define RID_STR_FONTSTYLE_ITALIC ( RID_FORMBROWSER_START + 253 )
#define RID_STR_FONTSTYLE_BOLD ( RID_FORMBROWSER_START + 254 )
#define RID_STR_FONT_DEFAULT ( RID_FORMBROWSER_START + 255 )
#define RID_STR_SCROLL_WIDTH ( RID_FORMBROWSER_START + 256 )
#define RID_STR_SCROLL_HEIGHT ( RID_FORMBROWSER_START + 257 )
#define RID_STR_SCROLL_TOP ( RID_FORMBROWSER_START + 258 )
#define RID_STR_SCROLL_LEFT ( RID_FORMBROWSER_START + 259 )
// -----------------------------------------------------------------------
...
...
extensions/source/propctrlr/formstrings.hxx
Dosyayı görüntüle @
613f8a31
...
...
@@ -174,6 +174,10 @@ namespace pcr
PCR_CONSTASCII_STRING
(
PROPERTY_DEFAULT_SCROLLVALUE
,
"DefaultScrollValue"
);
PCR_CONSTASCII_STRING
(
PROPERTY_SCROLLVALUE_MIN
,
"ScrollValueMin"
);
PCR_CONSTASCII_STRING
(
PROPERTY_SCROLLVALUE_MAX
,
"ScrollValueMax"
);
PCR_CONSTASCII_STRING
(
PROPERTY_SCROLL_WIDTH
,
"ScrollWidth"
);
PCR_CONSTASCII_STRING
(
PROPERTY_SCROLL_HEIGHT
,
"ScrollHeight"
);
PCR_CONSTASCII_STRING
(
PROPERTY_SCROLL_TOP
,
"ScrollTop"
);
PCR_CONSTASCII_STRING
(
PROPERTY_SCROLL_LEFT
,
"ScrollLeft"
);
PCR_CONSTASCII_STRING
(
PROPERTY_LINEINCREMENT
,
"LineIncrement"
);
PCR_CONSTASCII_STRING
(
PROPERTY_BLOCKINCREMENT
,
"BlockIncrement"
);
PCR_CONSTASCII_STRING
(
PROPERTY_VISIBLESIZE
,
"VisibleSize"
);
...
...
toolkit/inc/toolkit/awt/scrollabledialog.hxx
Dosyayı görüntüle @
613f8a31
...
...
@@ -36,16 +36,35 @@ namespace toolkit
{
class
ScrollableDialog
:
public
Dialog
{
Window
maContents
;
ScrollBar
maHScrollBar
;
ScrollBar
maVScrollBar
;
Size
maScrollArea
;
bool
mbHasHoriBar
;
bool
mbHasVertBar
;
Point
mnScrollPos
;
long
mnScrWidth
;
public
:
enum
ScrollBarVisibility
{
None
,
Vert
,
Hori
,
Both
};
private
:
ScrollBarVisibility
maScrollVis
;
void
lcl_Scroll
(
long
nX
,
long
nY
);
public
:
ScrollableDialog
(
Window
*
pParent
,
WinBits
nStyle
=
WB_STDDIALOG
);
virtual
~
ScrollableDialog
();
void
SetScrollWidth
(
long
nWidth
);
long
GetScrollWidth
()
{
return
maScrollArea
.
Width
();
}
void
SetScrollHeight
(
long
nHeight
);
long
GetScrollHeight
()
{
return
maScrollArea
.
Height
();
}
void
SetScrollLeft
(
long
nLeft
);
long
GetScrollLeft
()
{
return
mnScrollPos
.
X
();
}
void
SetScrollTop
(
long
Top
);
long
GetScrollTop
()
{
return
mnScrollPos
.
Y
()
;
}
Window
*
getContentWindow
();
ScrollBarVisibility
getScrollVisibility
()
{
return
maScrollVis
;
}
void
setScrollVisibility
(
ScrollBarVisibility
rState
);
virtual
void
Paint
(
const
Rectangle
&
rRect
);
virtual
void
Draw
(
OutputDevice
*
pDev
,
const
Point
&
rPos
,
const
Size
&
rSize
,
sal_uLong
nFlags
);
DECL_LINK
(
ScrollBarHdl
,
ScrollBar
*
);
DECL_LINK
(
ContainerScrolled
,
void
*
);
// Window
...
...
toolkit/inc/toolkit/helper/property.hxx
Dosyayı görüntüle @
613f8a31
...
...
@@ -211,6 +211,8 @@ namespace rtl {
#define BASEPROPERTY_ROW_HEADER_WIDTH 158
#define BASEPROPERTY_COLUMN_HEADER_HEIGHT 159
#define BASEPROPERTY_USE_GRID_LINES 160
#define BASEPROPERTY_HORISCROLL 161
#define BASEPROPERTY_VERTSCROLL 162
// These properties are not bound, they are always extracted from the BASEPROPERTY_FONTDESCRIPTOR property
...
...
toolkit/source/awt/scrollabledialog.cxx
Dosyayı görüntüle @
613f8a31
...
...
@@ -3,14 +3,44 @@
namespace
toolkit
{
ScrollableDialog
::
ScrollableDialog
(
Window
*
pParent
,
WinBits
nStyle
)
:
Dialog
(
pParent
,
nStyle
),
maContents
(
this
,
nStyle
),
maHScrollBar
(
this
,
WB_HSCROLL
|
WB_DRAG
),
maVScrollBar
(
this
,
WB_VSCROLL
|
WB_DRAG
),
mbHasHoriBar
(
true
),
mbHasVertBar
(
tru
e
)
ScrollableDialog
::
ScrollableDialog
(
Window
*
pParent
,
WinBits
nStyle
)
:
Dialog
(
pParent
,
nStyle
|
~
(
WB_HSCROLL
|
WB_VSCROLL
)
),
maHScrollBar
(
this
,
WB_HSCROLL
|
WB_DRAG
),
maVScrollBar
(
this
,
WB_VSCROLL
|
WB_DRAG
),
mbHasHoriBar
(
false
),
mbHasVertBar
(
false
),
maScrollVis
(
Non
e
)
{
Link
aLink
(
LINK
(
this
,
ScrollableDialog
,
ScrollBarHdl
)
);
maVScrollBar
.
SetScrollHdl
(
aLink
);
maHScrollBar
.
SetScrollHdl
(
aLink
);
maContents
.
Show
();
maVScrollBar
.
Show
();
maHScrollBar
.
Show
();
Size
aOutSz
=
GetOutputSizePixel
();
ScrollBarVisibility
aVis
=
None
;
if
(
nStyle
&
(
WB_HSCROLL
|
WB_VSCROLL
)
)
{
if
(
nStyle
&
WB_HSCROLL
)
aVis
=
Hori
;
if
(
nStyle
&
WB_VSCROLL
)
{
if
(
aVis
==
Hori
)
aVis
=
Both
;
else
aVis
=
Vert
;
}
}
setScrollVisibility
(
aVis
);
mnScrWidth
=
GetSettings
().
GetStyleSettings
().
GetScrollBarSize
();
}
void
ScrollableDialog
::
setScrollVisibility
(
ScrollBarVisibility
rVisState
)
{
maScrollVis
=
rVisState
;
if
(
maScrollVis
==
Hori
||
maScrollVis
==
Both
)
mbHasHoriBar
=
true
;
if
(
maScrollVis
==
Vert
||
maScrollVis
==
Both
)
mbHasVertBar
=
true
;
if
(
mbHasVertBar
)
maVScrollBar
.
Show
();
if
(
mbHasHoriBar
)
maHScrollBar
.
Show
();
if
(
mbHasHoriBar
||
mbHasVertBar
)
SetStyle
(
GetStyle
()
|
WB_CLIPCHILDREN
|
SCROLL_UPDATE
);
}
ScrollableDialog
::~
ScrollableDialog
()
...
...
@@ -19,42 +49,109 @@ ScrollableDialog::~ScrollableDialog()
Window
*
ScrollableDialog
::
getContentWindow
()
{
return
&
maContents
;
return
this
;
}
void
ScrollableDialog
::
lcl_Scroll
(
long
nX
,
long
nY
)
{
long
nXScroll
=
mnScrollPos
.
Y
()
-
nX
;
long
nYScroll
=
mnScrollPos
.
X
()
-
nY
;
mnScrollPos
=
Point
(
nX
,
nY
);
Rectangle
aScrollableArea
(
0
,
0
,
maScrollArea
.
Width
(),
maScrollArea
.
Height
()
);
Window
::
Scroll
(
nXScroll
,
nYScroll
,
aScrollableArea
);
// Manually scroll all children ( except the scrollbars )
for
(
int
index
=
0
;
index
<
GetChildCount
();
++
index
)
{
Window
*
pChild
=
GetChild
(
index
);
if
(
pChild
&&
pChild
!=
&
maVScrollBar
&&
pChild
!=
&
maHScrollBar
)
{
Point
aPos
=
pChild
->
GetPosPixel
();
aPos
+=
Point
(
nXScroll
,
nYScroll
);
pChild
->
SetPosPixel
(
aPos
);
}
}
}
IMPL_LINK
(
ScrollableDialog
,
ScrollBarHdl
,
ScrollBar
*
,
pSB
)
{
sal_uInt16
nPos
=
(
sal_uInt16
)
pSB
->
GetThumbPos
();
Rectangle
aScrollableArea
(
0
,
0
,
maContents
.
GetSizePixel
().
Width
(),
maContents
.
GetSizePixel
().
Height
()
);
if
(
pSB
==
&
maVScrollBar
)
Scroll
(
0
,
nPos
);
else
if
(
pSB
==
&
maHScrollBar
)
lcl_Scroll
(
nPos
,
0
);
#if 0
sal_uInt16 nPos = (sal_uInt16) pSB->GetThumbPos();
Rectangle aScrollableArea( 0, 0, maScrollArea.Width(), maScrollArea.Height() );
Point aScroll;
if( pSB == &maVScrollBar )
{
printf("vertical scroll %d\n", nPos );
printf
(
"vertical scroll %d
\n
"
,
nPos
);
long
nScroll
=
mnScrollPos
.
Y
()
-
nPos
;
maContents
.
Scroll
(
0
,
nScroll
,
aScrollableArea
);
Size aTmpScroll( nPos, nPos );
long nScroll = mnScrollPos.Y() - aTmpScroll.Width();
// I'm guessing I need to call scroll for ( stuff ) to happen
Scroll(0, nScroll, aScrollableArea );
mnScrollPos.Y() = nPos;
aScroll.Y() = nScroll;
}
else if( pSB == &maHScrollBar )
{
printf("horizontal scroll %d\n", nPos );
long
nScroll
=
mnScrollPos
.
X
()
-
nPos
;
maContents
.
Scroll
(
nScroll
,
0
,
aScrollableArea
);
Size aTmpScroll( nPos, nPos );
long nScroll = mnScrollPos.X() - aTmpScroll.Width();
Scroll( nScroll, 0, aScrollableArea);
mnScrollPos.X() = nPos;
aScroll.X() = nScroll;
}
// Manually scroll all children ( except the scrollbars )
for ( int index = 0; index < GetChildCount(); ++index )
{
Window* pChild = GetChild( index );
if ( pChild && pChild != &maVScrollBar && pChild != &maHScrollBar )
{
Point aPos = pChild->GetPosPixel();
aPos += Point( aScroll.X(), aScroll.Y() );
pChild->SetPosPixel( aPos );
}
}
#endif
return
1
;
}
void
ScrollableDialog
::
SetScrollWidth
(
long
nWidth
)
{
maScrollArea
.
Width
()
=
nWidth
;
}
void
ScrollableDialog
::
SetScrollHeight
(
long
nHeight
)
{
maScrollArea
.
Height
()
=
nHeight
;
}
void
ScrollableDialog
::
Paint
(
const
Rectangle
&
rRect
)
{
printf
(
"ScrollableDialog::Paint( %d, %d, %d, %d width %d height %d
\n
"
,
rRect
.
Top
(),
rRect
.
Left
(),
rRect
.
Right
(),
rRect
.
Bottom
(),
GetSizePixel
().
Width
(),
GetSizePixel
().
Height
()
);
Dialog
::
Paint
(
rRect
);
}
void
ScrollableDialog
::
Draw
(
OutputDevice
*
pDev
,
const
Point
&
rPos
,
const
Size
&
rSize
,
sal_uLong
nFlags
)
{
printf
(
"ScrollableDialog::Draw( ( %d, %d ) h %d, w %d
\n
"
,
rPos
.
X
(),
rPos
.
Y
(),
rSize
.
Height
(),
rSize
.
Width
()
);
Dialog
::
Draw
(
pDev
,
rPos
,
rSize
,
nFlags
);
}
void
ScrollableDialog
::
Resize
()
{
Size
aOutSz
=
GetOutputSizePixel
();
printf
(
"ScrollableDialog::Resize() - size is width %d height %d
\n
"
,
GetSizePixel
().
Width
(),
GetSizePixel
().
Height
()
);
maContents
.
SetSizePixel
(
GetSizePixel
()
);
// find the output area for the window
long
nMaxX
=
GetSizePixel
().
Width
();
long
nMaxY
=
GetSizePixel
().
Height
();
for
(
int
index
=
0
,
count
=
maContents
.
GetChildCount
();
index
<
count
;
++
index
)
for
(
int
index
=
0
,
count
=
GetChildCount
();
index
<
count
;
++
index
)
{
Window
*
pChild
=
maContents
.
GetChild
(
index
);
Window
*
pChild
=
GetChild
(
index
);
if
(
pChild
)
{
Point
aPos
=
pChild
->
GetPosPixel
();
...
...
@@ -68,34 +165,33 @@ void ScrollableDialog::Resize()
}
}
Size
aOutSz
=
GetOutputSizePixel
();
long
nScrWidth
=
GetSettings
().
GetStyleSettings
().
GetScrollBarSize
();
#if 0
// assume for the moment that we have both hori & vert scroll bars
Size aContentsSize( aOutSz );
if ( mbHasVertBar )
{
aContentsSize
.
Width
()
-=
nScrWidth
;
aContentsSize.Width() -=
m
nScrWidth;
nMaxX += nScrWidth;
}
if ( mbHasHoriBar )
{
aContentsSize
.
Height
()
-=
nScrWidth
;
nMaxY
+=
nScrWidth
;
aContentsSize.Height() -=
m
nScrWidth;
nMaxY +=
m
nScrWidth;
}
maContents.SetSizePixel( aContentsSize );
#endif
Point
aVPos
(
aOutSz
.
Width
()
-
nScrWidth
,
0
);
Point
aHPos
(
0
,
aOutSz
.
Height
()
-
nScrWidth
);
Point
aVPos
(
aOutSz
.
Width
()
-
m
nScrWidth
,
0
);
Point
aHPos
(
0
,
aOutSz
.
Height
()
-
m
nScrWidth
);
maVScrollBar
.
SetPosSizePixel
(
aVPos
,
Size
(
nScrWidth
,
aContentsSize
.
Height
()
)
);
maHScrollBar
.
SetPosSizePixel
(
aHPos
,
Size
(
aContentsSize
.
Width
(),
nScrWidth
)
);
maHScrollBar
.
SetRangeMax
(
nMaxX
);
maVScrollBar
.
SetPosSizePixel
(
aVPos
,
Size
(
mnScrWidth
,
GetSizePixel
().
Height
()
-
mnScrWidth
)
);
maHScrollBar
.
SetPosSizePixel
(
aHPos
,
Size
(
GetSizePixel
().
Width
()
-
mnScrWidth
,
m
nScrWidth
)
);
maHScrollBar
.
SetRangeMax
(
maScrollArea
.
Width
()
);
maHScrollBar
.
SetVisibleSize
(
GetSizePixel
().
Width
()
);
maHScrollBar
.
SetPageSize
(
GetSizePixel
()
.
Width
()
);
maVScrollBar
.
SetRangeMax
(
nMaxY
);
maHScrollBar
.
SetPageSize
(
maScrollArea
.
Width
()
);
maVScrollBar
.
SetRangeMax
(
maScrollArea
.
Height
()
);
maVScrollBar
.
SetVisibleSize
(
GetSizePixel
().
Height
()
);
maVScrollBar
.
SetPageSize
(
GetSizePixel
()
.
Height
()
);
maVScrollBar
.
SetPageSize
(
maScrollArea
.
Height
()
);
}
}
// toolkit
...
...
toolkit/source/awt/vclxtoolkit.cxx
Dosyayı görüntüle @
613f8a31
...
...
@@ -787,7 +787,7 @@ Window* VCLXToolkit::ImplCreateWindow( VCLXWindow** ppNewComp,
// Modal/Modeless nur durch Show/Execute
if
(
(
pParent
==
NULL
)
&&
(
rDescriptor
.
ParentIndex
==
-
1
)
)
pParent
=
DIALOG_NO_PARENT
;
pNewWindow
=
new
toolkit
::
ScrollableDialog
(
pParent
,
nWinBits
|
WB_AUTOHSCROLL
|
WB_AUTOVSCROLL
);
pNewWindow
=
new
toolkit
::
ScrollableDialog
(
pParent
,
nWinBits
);
// #i70217# Don't always create a new component object. It's possible that VCL has called
// GetComponentInterface( sal_True ) in the Dialog ctor itself (see Window::IsTopWindow() )
// which creates a component object.
...
...
@@ -1062,6 +1062,7 @@ css::uno::Reference< css::awt::XWindowPeer > VCLXToolkit::ImplCreateWindow(
if
(
pParentComponent
)
pParent
=
pParentComponent
->
GetWindow
();
}
#if 0
// #FIXME inglorious HACK we possibly need to interface at XContainerWindowPeer ?
// to allow access to the 'real' parent that we pass to children
toolkit::ScrollableDialog* pSrcDialog = dynamic_cast< toolkit::ScrollableDialog* > ( pParent );
...
...
@@ -1070,7 +1071,7 @@ css::uno::Reference< css::awt::XWindowPeer > VCLXToolkit::ImplCreateWindow(
printf( "found a parent that is a scrollable dialog\n");
pParent = pSrcDialog->getContentWindow();
}
#endif
WinBits
nWinBits
=
ImplGetWinBits
(
rDescriptor
.
WindowAttributes
,
ImplGetComponentType
(
rDescriptor
.
WindowServiceName
)
);
nWinBits
|=
nForceWinBits
;
...
...
toolkit/source/controls/dialogcontrol.cxx
Dosyayı görüntüle @
613f8a31
...
...
@@ -173,6 +173,8 @@ UnoControlDialogModel::UnoControlDialogModel( const Reference< XMultiServiceFact
ImplRegisterProperty
(
BASEPROPERTY_DIALOGSOURCEURL
);
ImplRegisterProperty
(
BASEPROPERTY_GRAPHIC
);
ImplRegisterProperty
(
BASEPROPERTY_IMAGEURL
);
ImplRegisterProperty
(
BASEPROPERTY_HSCROLL
);
ImplRegisterProperty
(
BASEPROPERTY_VSCROLL
);
Any
aBool
;
aBool
<<=
(
sal_Bool
)
sal_True
;
...
...
toolkit/source/helper/property.cxx
Dosyayı görüntüle @
613f8a31
...
...
@@ -185,6 +185,7 @@ ImplPropertyInfo* ImplGetPropertyInfos( sal_uInt16& rElementCount )
DECL_PROP_2
(
"HelpURL"
,
HELPURL
,
::
rtl
::
OUString
,
BOUND
,
MAYBEDEFAULT
),
DECL_PROP_2
(
"HideInactiveSelection"
,
HIDEINACTIVESELECTION
,
bool
,
BOUND
,
MAYBEDEFAULT
),
DECL_PROP_2
(
"HighContrastMode"
,
HIGHCONTRASTMODE
,
bool
,
BOUND
,
MAYBEDEFAULT
),
DECL_PROP_2
(
"HoriScroll"
,
HORISCROLL
,
bool
,
BOUND
,
MAYBEDEFAULT
),
DECL_PROP_2
(
"HScroll"
,
HSCROLL
,
bool
,
BOUND
,
MAYBEDEFAULT
),
DECL_PROP_2
(
"HardLineBreaks"
,
HARDLINEBREAKS
,
bool
,
BOUND
,
MAYBEDEFAULT
),
DECL_PROP_2
(
"ImageAlign"
,
IMAGEALIGN
,
sal_Int16
,
BOUND
,
MAYBEDEFAULT
),
...
...
@@ -256,6 +257,7 @@ ImplPropertyInfo* ImplGetPropertyInfos( sal_uInt16& rElementCount )
DECL_PROP_2
(
"ValueMin"
,
VALUEMIN_DOUBLE
,
double
,
BOUND
,
MAYBEDEFAULT
),
DECL_PROP_2
(
"ValueStep"
,
VALUESTEP_DOUBLE
,
double
,
BOUND
,
MAYBEDEFAULT
),
DECL_PROP_3
(
"VerticalAlign"
,
VERTICALALIGN
,
VerticalAlignment
,
BOUND
,
MAYBEDEFAULT
,
MAYBEVOID
),
DECL_PROP_2
(
"VertScroll"
,
VERTSCROLL
,
bool
,
BOUND
,
MAYBEDEFAULT
),
DECL_DEP_PROP_3
(
"VisibleSize"
,
VISIBLESIZE
,
sal_Int32
,
BOUND
,
MAYBEDEFAULT
,
MAYBEVOID
),
DECL_PROP_2
(
"Activated"
,
ACTIVATED
,
sal_Bool
,
BOUND
,
MAYBEDEFAULT
),
DECL_PROP_2
(
"Complete"
,
COMPLETE
,
sal_Bool
,
BOUND
,
MAYBEDEFAULT
),
...
...
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