Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
K
kicad-source-mirror
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Commits
Open sidebar
Elphel
kicad-source-mirror
Commits
b8a449e0
Commit
b8a449e0
authored
Oct 12, 2007
by
dickelbeck
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
smd pad in high-contrast mode enhancement
parent
2d4d4271
Changes
7
Hide whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
114 additions
and
59 deletions
+114
-59
change_log.txt
change_log.txt
+11
-0
gr_basic.h
include/gr_basic.h
+46
-46
class_pad.cpp
pcbnew/class_pad.cpp
+49
-5
class_track.cpp
pcbnew/class_track.cpp
+1
-1
cotation.cpp
pcbnew/cotation.cpp
+1
-1
onrightclick.cpp
pcbnew/onrightclick.cpp
+2
-2
tool_pcb.cpp
pcbnew/tool_pcb.cpp
+4
-4
No files found.
change_log.txt
View file @
b8a449e0
...
...
@@ -4,6 +4,17 @@ Started 2007-June-11
Please add newer entries at the top, list the date and your name with
email address.
2007-Oct-11 UPDATE Dick Hollenbeck <dick@softplc.com>
================================================================================
+ pcbnew
* D_PAD::Draw() so that it shows SMD pads as greyed out when in high contrast
mode and not on current layer. Slight variation on this when laying down
tracks: m_Route_Layer_BOTTOM or m_Route_Layer_TOP layers' SMD pads are
not greyed out.
* Changed English UI text for "Cotation" to "Dimension".
2007-Oct-11 UPDATE Geoff Harland <gharlandau@yahoo.com.au>
================================================================================
+ pcbnew
...
...
include/gr_basic.h
View file @
b8a449e0
/**************/
/* gr_basic.h */
/**************/
/**************/
/* gr_basic.h */
/**************/
#ifndef GR_BASIC
#define GR_BASIC
...
...
@@ -13,42 +13,42 @@
/* Constantes utiles */
#define GR_COPY 0
#define GR_OR
0x
1000000
#define GR_XOR
0x
2000000
#define GR_AND
0x
4000000
#define GR_NXOR
0x
8000000
#define GR_COPY
0
#define GR_OR
0x0
1000000
#define GR_XOR
0x0
2000000
#define GR_AND
0x0
4000000
#define GR_NXOR
0x0
8000000
#define GR_SURBRILL 0x80000000
#define GR_SURBRILL
0x80000000
#define GR_M_LEFT_DOWN
0x10000000
#define GR_M_RIGHT_DOWN
0x20000000
#define GR_M_MIDDLE_DOWN
0x40000000
#define GR_M_DCLICK
0x80000000
#define GR_M_LEFT_DOWN
0x10000000
#define GR_M_RIGHT_DOWN
0x20000000
#define GR_M_MIDDLE_DOWN
0x40000000
#define GR_M_DCLICK
0x80000000
/* variables generales */
COMMON_GLOBL
int
g_XorMode
// = GR_XOR ou GR_NXOR selon couleur de fond
#ifdef EDA_BASE
// pour les tracs en mode XOR
COMMON_GLOBL
int
g_XorMode
// = GR_XOR ou GR_NXOR selon couleur de fond
#ifdef EDA_BASE
// pour les tracs en mode XOR
=
GR_NXOR
#endif
;
COMMON_GLOBL
int
g_DrawBgColor
// couleur de fond de la frame de dessin
COMMON_GLOBL
int
g_DrawBgColor
// couleur de fond de la frame de dessin
#ifdef EDA_BASE
=
WHITE
#endif
;
typedef
enum
{
/* Line styles for Get/SetLineStyle. */
GR_SOLID_LINE
=
0
,
GR_DOTTED_LINE
=
1
,
GR_DASHED_LINE
=
3
typedef
enum
{
/* Line styles for Get/SetLineStyle. */
GR_SOLID_LINE
=
0
,
GR_DOTTED_LINE
=
1
,
GR_DASHED_LINE
=
3
}
GRLineStypeType
;
typedef
enum
{
/* Line widths for Get/SetLineStyle. */
GR_NORM_WIDTH
=
1
,
GR_THICK_WIDTH
=
3
typedef
enum
{
/* Line widths for Get/SetLineStyle. */
GR_NORM_WIDTH
=
1
,
GR_THICK_WIDTH
=
3
}
GRLineWidthType
;
...
...
@@ -87,42 +87,42 @@ void GRSMoveRel(int x, int y);
void
GRLineRel
(
EDA_Rect
*
ClipBox
,
wxDC
*
DC
,
int
x
,
int
y
,
int
width
,
int
Color
);
void
GRSLineRel
(
EDA_Rect
*
ClipBox
,
wxDC
*
DC
,
int
x
,
int
y
,
int
width
,
int
Color
);
void
GRPoly
(
EDA_Rect
*
ClipBox
,
wxDC
*
DC
,
int
n
,
int
*
Points
,
int
Fill
,
int
width
,
int
Color
,
int
BgColor
);
int
Fill
,
int
width
,
int
Color
,
int
BgColor
);
void
GRClosedPoly
(
EDA_Rect
*
ClipBox
,
wxDC
*
DC
,
int
n
,
int
*
Points
,
int
Fill
,
int
Color
,
int
BgColor
);
int
Fill
,
int
Color
,
int
BgColor
);
void
GRClosedPoly
(
EDA_Rect
*
ClipBox
,
wxDC
*
DC
,
int
n
,
int
*
Points
,
int
Fill
,
int
width
,
int
Color
,
int
BgColor
);
int
Fill
,
int
width
,
int
Color
,
int
BgColor
);
void
GRSPoly
(
EDA_Rect
*
ClipBox
,
wxDC
*
DC
,
int
n
,
int
*
Points
,
int
Fill
,
int
width
,
int
Color
,
int
BgColor
);
int
Fill
,
int
width
,
int
Color
,
int
BgColor
);
void
GRSClosedPoly
(
EDA_Rect
*
ClipBox
,
wxDC
*
DC
,
int
n
,
int
*
Points
,
int
Fill
,
int
width
,
int
Color
,
int
BgColor
);
int
Fill
,
int
width
,
int
Color
,
int
BgColor
);
void
GRCircle
(
EDA_Rect
*
ClipBox
,
wxDC
*
DC
,
int
x
,
int
y
,
int
r
,
int
Color
);
void
GRCircle
(
EDA_Rect
*
ClipBox
,
wxDC
*
DC
,
int
x
,
int
y
,
int
r
,
int
width
,
int
Color
);
void
GRFilledCircle
(
EDA_Rect
*
ClipBox
,
wxDC
*
DC
,
int
x
,
int
y
,
int
r
,
int
width
,
int
Color
,
int
BgColor
);
int
width
,
int
Color
,
int
BgColor
);
void
GRSCircle
(
EDA_Rect
*
ClipBox
,
wxDC
*
DC
,
int
x
,
int
y
,
int
r
,
int
width
,
int
Color
);
void
GRSFilledCircle
(
EDA_Rect
*
ClipBox
,
wxDC
*
DC
,
int
x
,
int
y
,
int
r
,
int
width
,
int
Color
,
int
BgColor
);
int
width
,
int
Color
,
int
BgColor
);
void
GRArc
(
EDA_Rect
*
ClipBox
,
wxDC
*
DC
,
int
x
,
int
y
,
int
StAngle
,
int
EndAngle
,
int
r
,
int
Color
);
void
GRArc
(
EDA_Rect
*
ClipBox
,
wxDC
*
DC
,
int
x
,
int
y
,
int
StAngle
,
int
EndAngle
,
int
r
,
int
width
,
int
Color
);
void
GRArc1
(
EDA_Rect
*
ClipBox
,
wxDC
*
DC
,
int
x1
,
int
y1
,
int
x2
,
int
y2
,
int
xc
,
int
yc
,
int
Color
);
int
xc
,
int
yc
,
int
Color
);
void
GRArc1
(
EDA_Rect
*
ClipBox
,
wxDC
*
DC
,
int
x1
,
int
y1
,
int
x2
,
int
y2
,
int
xc
,
int
yc
,
int
width
,
int
Color
);
int
xc
,
int
yc
,
int
width
,
int
Color
);
void
GRSArc1
(
EDA_Rect
*
ClipBox
,
wxDC
*
DC
,
int
x1
,
int
y1
,
int
x2
,
int
y2
,
int
xc
,
int
yc
,
int
width
,
int
Color
);
int
xc
,
int
yc
,
int
width
,
int
Color
);
void
GRSArc
(
EDA_Rect
*
ClipBox
,
wxDC
*
DC
,
int
x
,
int
y
,
int
StAngle
,
int
EndAngle
,
int
r
,
int
width
,
int
Color
);
void
GRFilledArc
(
EDA_Rect
*
ClipBox
,
wxDC
*
DC
,
int
x
,
int
y
,
int
StAngle
,
int
EndAngle
,
int
r
,
int
Color
,
int
BgColor
);
int
StAngle
,
int
EndAngle
,
int
r
,
int
Color
,
int
BgColor
);
void
GRFilledArc
(
EDA_Rect
*
ClipBox
,
wxDC
*
DC
,
int
x
,
int
y
,
int
StAngle
,
int
EndAngle
,
int
r
,
int
width
,
int
Color
,
int
BgColor
);
int
StAngle
,
int
EndAngle
,
int
r
,
int
width
,
int
Color
,
int
BgColor
);
void
GRSFilledArc
(
EDA_Rect
*
ClipBox
,
wxDC
*
DC
,
int
x
,
int
y
,
int
StAngle
,
int
EndAngle
,
int
r
,
int
width
,
int
Color
,
int
BgColor
);
int
StAngle
,
int
EndAngle
,
int
r
,
int
width
,
int
Color
,
int
BgColor
);
void
GRCSegm
(
EDA_Rect
*
ClipBox
,
wxDC
*
DC
,
int
x1
,
int
y1
,
int
x2
,
int
y2
,
int
width
,
int
Color
);
void
GRFillCSegm
(
EDA_Rect
*
ClipBox
,
wxDC
*
DC
,
int
x1
,
int
y1
,
int
x2
,
int
y2
,
int
width
,
int
Color
);
void
GRSCSegm
(
EDA_Rect
*
ClipBox
,
wxDC
*
DC
,
int
x1
,
int
y1
,
int
x2
,
int
y2
,
int
width
,
int
Color
);
void
GRSFillCSegm
(
EDA_Rect
*
ClipBox
,
wxDC
*
DC
,
int
x1
,
int
y1
,
int
x2
,
int
y2
,
int
width
,
int
Color
);
int
x1
,
int
y1
,
int
x2
,
int
y2
,
int
width
,
int
Color
);
void
GRSetColor
(
int
Color
);
void
GRSetDefaultPalette
();
...
...
@@ -131,21 +131,21 @@ void GRPutPixel(EDA_Rect * ClipBox, wxDC * DC, int x, int y, int color);
void
GRSPutPixel
(
EDA_Rect
*
ClipBox
,
wxDC
*
DC
,
int
x
,
int
y
,
int
color
);
int
GRGetPixel
(
wxDC
*
DC
,
int
x
,
int
y
);
void
GRFilledRect
(
EDA_Rect
*
ClipBox
,
wxDC
*
DC
,
int
x1
,
int
y1
,
int
x2
,
int
y2
,
int
Color
,
int
BgColor
);
int
x2
,
int
y2
,
int
Color
,
int
BgColor
);
void
GRFilledRect
(
EDA_Rect
*
ClipBox
,
wxDC
*
DC
,
int
x1
,
int
y1
,
int
x2
,
int
y2
,
int
width
,
int
Color
,
int
BgColor
);
int
x2
,
int
y2
,
int
width
,
int
Color
,
int
BgColor
);
void
GRSFilledRect
(
EDA_Rect
*
ClipBox
,
wxDC
*
DC
,
int
x1
,
int
y1
,
int
x2
,
int
y2
,
int
Color
,
int
BgColor
);
int
x2
,
int
y2
,
int
Color
,
int
BgColor
);
void
GRSFilledRect
(
EDA_Rect
*
ClipBox
,
wxDC
*
DC
,
int
x1
,
int
y1
,
int
x2
,
int
y2
,
int
width
,
int
Color
,
int
BgColor
);
int
x2
,
int
y2
,
int
width
,
int
Color
,
int
BgColor
);
void
GRRect
(
EDA_Rect
*
ClipBox
,
wxDC
*
DC
,
int
x1
,
int
y1
,
int
x2
,
int
y2
,
int
Color
);
int
x2
,
int
y2
,
int
Color
);
void
GRRect
(
EDA_Rect
*
ClipBox
,
wxDC
*
DC
,
int
x1
,
int
y1
,
int
x2
,
int
y2
,
int
width
,
int
Color
);
int
x2
,
int
y2
,
int
width
,
int
Color
);
void
GRSRect
(
EDA_Rect
*
ClipBox
,
wxDC
*
DC
,
int
x1
,
int
y1
,
int
x2
,
int
y2
,
int
Color
);
int
x2
,
int
y2
,
int
Color
);
void
GRSRect
(
EDA_Rect
*
ClipBox
,
wxDC
*
DC
,
int
x1
,
int
y1
,
int
x2
,
int
y2
,
int
width
,
int
Color
);
int
x2
,
int
y2
,
int
width
,
int
Color
);
/* Routines relatives a l'affichage des textes */
void
GRSetFont
(
wxDC
*
DC
,
wxFont
*
Font
);
...
...
@@ -158,5 +158,5 @@ void GRSetTextBgColor(wxDC * DC, wxFont * Font, int Color);
int
GRGetTextBgColor
(
wxDC
*
DC
,
wxFont
*
Font
);
void
GRGetTextExtent
(
wxDC
*
DC
,
const
wxChar
*
Text
,
long
*
width
,
long
*
height
);
#endif
/* define GR_BASIC */
#endif
/* define GR_BASIC */
pcbnew/class_pad.cpp
View file @
b8a449e0
...
...
@@ -9,6 +9,7 @@
#include "common.h"
#include "pcbnew.h"
#include "trigo.h"
#include "id.h" // ID_TRACK_BUTT
#ifdef PCBNEW
#include "drag.h"
...
...
@@ -238,13 +239,16 @@ void D_PAD::Draw( WinEDA_DrawPanel* panel, wxDC* DC, const wxPoint& offset, int
wxPoint
coord
[
4
];
int
zoom
;
int
fillpad
=
0
;
PCB_SCREEN
*
screen
;
WinEDA_BasePcbFrame
*
frame
;
wxPoint
shape_pos
;
screen
=
panel
?
(
PCB_SCREEN
*
)
panel
->
m_Parent
->
m_CurrentScreen
:
(
PCB_SCREEN
*
)
ActiveScreen
;
frame
=
(
WinEDA_BasePcbFrame
*
)
panel
->
m_Parent
;
PCB_SCREEN
*
screen
=
panel
?
(
PCB_SCREEN
*
)
panel
->
m_Parent
->
m_CurrentScreen
:
(
PCB_SCREEN
*
)
ActiveScreen
;
// @todo: if panel could have been NULL above, how can we dereference it here safely?
frame
=
(
WinEDA_BasePcbFrame
*
)
panel
->
m_Parent
;
/* Calcul de l'aspect du pad */
if
(
frame
->
m_DisplayPadFill
==
FILLED
)
fillpad
=
1
;
...
...
@@ -255,8 +259,10 @@ void D_PAD::Draw( WinEDA_DrawPanel* panel, wxDC* DC, const wxPoint& offset, int
if
(
m_Flags
&
IS_MOVED
)
fillpad
=
0
;
#endif
if
(
m_Masque_Layer
&
CMP_LAYER
)
color
=
g_PadCMPColor
;
if
(
m_Masque_Layer
&
CUIVRE_LAYER
)
color
|=
g_PadCUColor
;
...
...
@@ -322,6 +328,37 @@ void D_PAD::Draw( WinEDA_DrawPanel* panel, wxDC* DC, const wxPoint& offset, int
}
}
//-----<test this>-----
// if SMD pad and high contrast mode
if
(
m_Attribut
==
SMD
&&
DisplayOpt
.
ContrastModeDisplay
)
{
// when editing tracks show SMD components on either of the routing
// layers as normal, not greyed out.
if
(
frame
->
m_ID_current_state
==
ID_TRACK_BUTT
)
{
if
(
!
IsOnLayer
(
screen
->
m_Active_Layer
)
&&
!
IsOnLayer
(
screen
->
m_Route_Layer_TOP
)
&&
!
IsOnLayer
(
screen
->
m_Route_Layer_BOTTOM
)
)
{
color
&=
~
MASKCOLOR
;
color
|=
DARKDARKGRAY
;
}
}
// when not edting tracks, show SMD components not on active layer as greyed out
else
{
if
(
!
IsOnLayer
(
screen
->
m_Active_Layer
)
)
{
color
&=
~
MASKCOLOR
;
color
|=
DARKDARKGRAY
;
}
}
}
//-----</test this>----
if
(
draw_mode
&
GR_SURBRILL
)
{
if
(
draw_mode
&
GR_AND
)
...
...
@@ -329,6 +366,7 @@ void D_PAD::Draw( WinEDA_DrawPanel* panel, wxDC* DC, const wxPoint& offset, int
else
color
|=
HIGHT_LIGHT_FLAG
;
}
if
(
color
&
HIGHT_LIGHT_FLAG
)
color
=
ColorRefs
[
color
&
MASKCOLOR
].
m_LightColor
;
...
...
@@ -347,6 +385,7 @@ void D_PAD::Draw( WinEDA_DrawPanel* panel, wxDC* DC, const wxPoint& offset, int
dy
=
dy0
=
m_Size
.
y
>>
1
;
/* demi dim dx et dy */
angle
=
m_Orient
;
bool
DisplayIsol
=
DisplayOpt
.
DisplayPadIsol
;
if
(
(
m_Masque_Layer
&
ALL_CU_LAYERS
)
==
0
)
DisplayIsol
=
FALSE
;
...
...
@@ -375,12 +414,14 @@ void D_PAD::Draw( WinEDA_DrawPanel* panel, wxDC* DC, const wxPoint& offset, int
/* calcul de l'entraxe de l'ellipse */
if
(
dx
>
dy
)
/* ellipse horizontale */
{
delta_cx
=
dx
-
dy
;
delta_cy
=
0
;
delta_cx
=
dx
-
dy
;
delta_cy
=
0
;
rotdx
=
m_Size
.
y
;
}
else
/* ellipse verticale */
{
delta_cx
=
0
;
delta_cy
=
dy
-
dx
;
delta_cx
=
0
;
delta_cy
=
dy
-
dx
;
rotdx
=
m_Size
.
x
;
}
RotatePoint
(
&
delta_cx
,
&
delta_cy
,
angle
);
...
...
@@ -476,6 +517,7 @@ void D_PAD::Draw( WinEDA_DrawPanel* panel, wxDC* DC, const wxPoint& offset, int
if
(
fillpad
&&
hole
)
{
color
=
g_IsPrinting
?
WHITE
:
BLACK
;
// ou DARKGRAY;
if
(
draw_mode
!=
GR_XOR
)
GRSetDrawMode
(
DC
,
GR_COPY
);
else
...
...
@@ -491,6 +533,7 @@ void D_PAD::Draw( WinEDA_DrawPanel* panel, wxDC* DC, const wxPoint& offset, int
case
OVALE
:
dx
=
m_Drill
.
x
>>
1
;
dy
=
m_Drill
.
y
>>
1
;
/* demi dim dx et dy */
/* calcul de l'entraxe de l'ellipse */
if
(
m_Drill
.
x
>
m_Drill
.
y
)
/* ellipse horizontale */
{
...
...
@@ -521,6 +564,7 @@ void D_PAD::Draw( WinEDA_DrawPanel* panel, wxDC* DC, const wxPoint& offset, int
{
dx0
=
MIN
(
dx0
,
dy0
);
int
nc_color
=
BLUE
;
if
(
m_Masque_Layer
&
CMP_LAYER
)
/* Trace forme \ */
GRLine
(
&
panel
->
m_ClipBox
,
DC
,
cx0
-
dx0
,
cy0
-
dx0
,
cx0
+
dx0
,
cy0
+
dx0
,
0
,
nc_color
);
...
...
pcbnew/class_track.cpp
View file @
b8a449e0
...
...
@@ -561,7 +561,7 @@ void TRACK::Draw( WinEDA_DrawPanel* panel, wxDC* DC, int draw_mode )
int
rayon
;
int
curr_layer
=
(
(
PCB_SCREEN
*
)
panel
->
GetScreen
()
)
->
m_Active_Layer
;
if
(
Type
()
==
TYPEZONE
&&
(
!
DisplayOpt
.
DisplayZones
)
)
if
(
Type
()
==
TYPEZONE
&&
!
DisplayOpt
.
DisplayZones
)
return
;
GRSetDrawMode
(
DC
,
draw_mode
);
...
...
pcbnew/cotation.cpp
View file @
b8a449e0
...
...
@@ -82,7 +82,7 @@ END_EVENT_TABLE()
WinEDA_CotationPropertiesFrame
::
WinEDA_CotationPropertiesFrame
(
WinEDA_PcbFrame
*
parent
,
COTATION
*
Cotation
,
wxDC
*
DC
,
const
wxPoint
&
framepos
)
:
wxDialog
(
parent
,
-
1
,
_
(
"
Cotat
ion properties"
),
framepos
,
wxSize
(
340
,
270
),
wxDialog
(
parent
,
-
1
,
_
(
"
Dimens
ion properties"
),
framepos
,
wxSize
(
340
,
270
),
DIALOG_STYLE
)
{
wxButton
*
Button
;
...
...
pcbnew/onrightclick.cpp
View file @
b8a449e0
...
...
@@ -317,10 +317,10 @@ bool WinEDA_PcbFrame::OnRightClick( const wxPoint& aMousePos, wxMenu* aPopMenu )
if
(
!
flags
)
{
ADD_MENUITEM
(
aPopMenu
,
ID_POPUP_PCB_EDIT_COTATION
,
_
(
"Edit
Cotat
ion"
),
edit_xpm
);
_
(
"Edit
Dimens
ion"
),
edit_xpm
);
}
ADD_MENUITEM
(
aPopMenu
,
ID_POPUP_PCB_DELETE_COTATION
,
_
(
"Delete
Cotat
ion"
),
delete_xpm
);
_
(
"Delete
Dimens
ion"
),
delete_xpm
);
break
;
case
TYPEMIRE
:
...
...
pcbnew/tool_pcb.cpp
View file @
b8a449e0
...
...
@@ -422,11 +422,11 @@ void WinEDA_PcbFrame::ReCreateVToolbar()
m_VToolBar
->
AddTool
(
ID_TRACK_BUTT
,
wxEmptyString
,
BITMAP
(
add_tracks_xpm
),
_
(
"Add
Tracks an
vias"
),
wxITEM_CHECK
);
_
(
"Add
tracks and
vias"
),
wxITEM_CHECK
);
m_VToolBar
->
AddTool
(
ID_PCB_ZONES_BUTT
,
wxEmptyString
,
BITMAP
(
add_zone_xpm
),
_
(
"Add
Z
ones"
),
wxITEM_CHECK
);
_
(
"Add
z
ones"
),
wxITEM_CHECK
);
m_VToolBar
->
AddSeparator
();
m_VToolBar
->
AddTool
(
ID_LINE_COMMENT_BUTT
,
wxEmptyString
,
...
...
@@ -443,12 +443,12 @@ void WinEDA_PcbFrame::ReCreateVToolbar()
m_VToolBar
->
AddTool
(
ID_TEXT_COMMENT_BUTT
,
wxEmptyString
,
BITMAP
(
add_text_xpm
),
_
(
"Add
T
ext"
),
wxITEM_CHECK
);
_
(
"Add
t
ext"
),
wxITEM_CHECK
);
m_VToolBar
->
AddSeparator
();
m_VToolBar
->
AddTool
(
ID_PCB_COTATION_BUTT
,
wxEmptyString
,
BITMAP
(
add_cotation_xpm
),
_
(
"Add
Cotat
ion"
),
wxITEM_CHECK
);
_
(
"Add
dimens
ion"
),
wxITEM_CHECK
);
m_VToolBar
->
AddTool
(
ID_PCB_MIRE_BUTT
,
wxEmptyString
,
BITMAP
(
add_mires_xpm
),
...
...
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